在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))
答案 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
只能包含整数值。
要避免此问题,您可以:
使用精度为零来格式化没有小数点的初始值:
String.Format(new CultureInfo("en-IN", true), "{0:n0}", t.PaymentReceived)
解析为十进制和舍入:
(long)Math.Round(decimal.Parse(s, new CultureInfo("en-IN", t.PaymentReceived)));