转换错误解析使用逗号格式化的数字作为数字组分隔符

时间:2015-12-14 07:18:02

标签: c# parsing formatting

在mvc中,我使用逗号格式化了数值作为number group separator中指定的Indian numbering system

PaymentReceived = String.Format(new CultureInfo("en-IN", true), "{0:n}", t.PaymentReceived)

稍后,我需要将字符串解析回数值。此处FieldValue的类型为long,而右侧值的类型为string。如何转换为long

我已经尝试过关注,但这会抛出错误消息(the input string was not in correct format):

FieldValue = Convert.ToInt64( String.Format(new CultureInfo("en-IN", true), "{0:n}", t1.FieldValue))

2 个答案:

答案 0 :(得分:1)

正如评论中所指出的,您不需要使用逗号格式化字符串以将其转换为long。逗号纯粹是一个表示问题,没有原始数字数据类型(int,long,double ...)将维护它们。

要将字符串转换为long,请执行此操作。

FieldValue = Convert.ToInt64(t1.FieldValue)

要将值显示为逗号分隔数字,请执行此操作

string formattedString = FieldValue.ToString("N0")

答案 1 :(得分:0)

您的问题不在于字符串中的数字组分隔符。您的问题是,在格式化数字时,您使用的是"{0:n}"格式,但没有指定精度。来自docs

  

如果省略精度说明符,则小数位数由当前NumberFormatInfo.NumberDecimalDigits属性定义。

对于"en-IN",默认的位数为2.因此,尽管数字很长,但您的数字仍然是十进制数字格式。即如果你这样做:

        long val = 1111111011;
        var s = String.Format(new CultureInfo("en-IN", true), "{0:n0}", val);
        Console.WriteLine(s);

结果看起来像1,11,11,11,011.00

稍后,您尝试将字符串解析回long - 它会抛出FormatException。该字符串的格式为long的格式无效,因为它包含小数点,而long只能包含整数值。

要避免此问题,您可以:

  1. 使用精度为零来格式化没有小数点的初始值:

    String.Format(new CultureInfo("en-IN", true), "{0:n0}", t.PaymentReceived)
    
  2. 解析为十进制和舍入:

    (long)Math.Round(decimal.Parse(s, new CultureInfo("en-IN", t.PaymentReceived)));