使用' $'转换字符串值成双

时间:2015-07-16 23:58:08

标签: c# type-conversion

尚未在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.InvariantCultureNumberFormatInfo.InvariantInfo

时的字符

(即在方法调用中使用其中一个注释掉的变量替换null

为什么?我是否真的需要将该参数设置为适合输入字符串国际化的参数之一?此方法的初始实现将参数设置为NumberFormatInfo.InvariantInfo,这会中断包含' $'的字符串的转换。

2 个答案:

答案 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);