C# 十进制到具有最大长度的字符串

本文关键字:字符串 十进制 | 更新日期: 2023-09-27 18:31:50

我必须以字符串格式发送十进制。字符串的最大长度为 15。如何通过四舍五入到最合适来做到这一点?

例如:

1111111111111119 = "111111111111112"

11111111111111.111

= "11111111111111"

1.11111111111119

= "1.1111111111112"

谢谢

C# 十进制到具有最大长度的字符串

我发现了一种非常不优雅的方法,但它可以处理您的测试用例和我发现的另一个边缘情况:

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**