尚未在SO上找到类似的问题(关于' $')。
我跟随this example,尝试扩展预先存在的方法,将字符串转换为双精度数。代码的一般结构如下所示:
string str = "$1,000.00";
double output;
var success = Double.TryParse(
str
, NumberStyles.AllowLeadingWhite
| NumberStyles.AllowTrailingWhite
| NumberStyles.AllowLeadingSign
| NumberStyles.AllowDecimalPoint
| NumberStyles.AllowThousands
| NumberStyles.AllowExponent
| NumberStyles.AllowCurrencySymbol
, null // CultureInfo.InvariantCulture
// or NumberFormatInfo.InvariantInfo break conversion with '$'..
, out output
);
Console.WriteLine("'{0}' --> {1}, {2}", str, output, success);
这很有效。我遇到的问题是处理' $' IFormatProvider
方法的Double.TryParse()
parameter设置为CultureInfo.InvariantCulture
或NumberFormatInfo.InvariantInfo
(即在方法调用中使用其中一个注释掉的变量替换null
)
为什么?我是否真的需要将该参数设置为适合输入字符串国际化的参数之一?此方法的初始实现将参数设置为NumberFormatInfo.InvariantInfo
,这会中断包含' $'的字符串的转换。
答案 0 :(得分:3)
为什么?
不变文化的货币符号为¤
,不是美元符号。这就是它失败的原因。
但是,您无需修改必须考虑的转换代码 - 但您可以修改传入的字符串。
static string ReplaceCurrency(string str)
{
return Regex.Replace(str, @"\p{Sc}", "¤");
}
这将使用不变符号替换任何货币符号 - 这将正确解析。
string str = "$1,000.00";
double output;
var success = Double.TryParse(ReplaceCurrency(str),
NumberStyles.Currency,
CultureInfo.InvariantCulture,
out output);
Console.WriteLine(output);
输出
1000
答案 1 :(得分:2)
有NumberStyles.AllowLeadingSign
的通知,您只需要按照它进行操作,只需使用new System.Globalization.NumberFormatInfo() { CurrencySymbol = "$" }
替换null
string str = "$1,000.00";
double output;
var success = Double.TryParse(
str
, NumberStyles.AllowLeadingWhite
| NumberStyles.AllowTrailingWhite
| NumberStyles.AllowLeadingSign
| NumberStyles.AllowDecimalPoint
| NumberStyles.AllowThousands
| NumberStyles.AllowExponent
| NumberStyles.AllowCurrencySymbol
, new System.Globalization.NumberFormatInfo() { CurrencySymbol = "$" }
// or NumberFormatInfo.InvariantInfo break conversion with '$'..
, out output
);
Console.WriteLine("'{0}' --> {1}, {2}", str, output, success);
由于这是金额,我会使用小数:
string str = "$1,000.00";
decimal output;
var success = decimal.TryParse(
str
, NumberStyles.AllowLeadingWhite
| NumberStyles.AllowTrailingWhite
| NumberStyles.AllowLeadingSign
| NumberStyles.AllowDecimalPoint
| NumberStyles.AllowThousands
| NumberStyles.AllowExponent
| NumberStyles.AllowCurrencySymbol
, new System.Globalization.NumberFormatInfo() { CurrencySymbol = "$" }
, out output
);
Console.WriteLine("'{0}' --> {1}, {2}", str, output, success);