C# 十进制到具有最大长度的字符串
本文关键字:字符串 十进制 | 更新日期: 2023-09-27 18:31:50
我必须以字符串格式发送十进制。字符串的最大长度为 15。如何通过四舍五入到最合适来做到这一点?
例如:
1111111111111119 = "111111111111112"
11111111111111.111= "11111111111111"
1.11111111111119= "1.1111111111112"
谢谢
我发现了一种非常不优雅的方法,但它可以处理您的测试用例和我发现的另一个边缘情况:
static string ToStringOfMaxLength(decimal x) {
const int maxLength = 15;
var str = x.ToString(System.Globalization.CultureInfo.InvariantCulture);
if(str.Length <= maxLength)
return str;
if(str[maxLength] == '.')
return str.Substring(0, maxLength);
if(str[maxLength - 1] == '.')
return str.Substring(0, maxLength - 1);
var digitsToDisplayExceptLast = str.Substring(0, maxLength - 1);
var lastDigitToDisplay = CharToInt(str[maxLength - 1]);
var firstDigitNotDisplayed = CharToInt(str[maxLength]);
if(firstDigitNotDisplayed >= 5)
lastDigitToDisplay++;
return digitsToDisplayExceptLast + lastDigitToDisplay;
}
static int CharToInt(char c) {
return (int)(c - 48);
}
此函数应该完全满足您的需求(在您的示例值上进行了测试):
string ValueString15(decimal value)
{
while (value >= 1000000000000000M) // for your first example case
value /= 10;
int dotIndex = value.ToString(CultureInfo.InvariantCulture).IndexOf('.');
value = (dotIndex >= 14) ? Math.Round(value) : Math.Round(value, 14 - dotIndex);
return value.ToString(CultureInfo.InvariantCulture);
}
如果您需要处理负值(即值<0),您还应该添加:
|| value <= -100000000000000M
到同时条件。
如果您只想将字符串削减为 15 个字符,
decimal sample = 123456789123456789;
string result = sample.ToString().Substring(0, 15); // this cuts it to 15 characters
**returns 123456789123456**
如果你想从 15 个字符四舍五入。
decimal sample = 123456789123456789;
double result2 = Math.Round(sample.ToString().Substring(0, 16));
**returns 123456789123457**