C# 使用'转换字符串值$';双倍

C# 使用'转换字符串值$';双倍,c#,type-conversion,C#,Type Conversion,尚未发现类似的问题(关于“$”) 下面,我尝试扩展一个预先存在的方法,将字符串转换为双精度字符串。代码的总体结构如下所示: string str = "$1,000.00"; double output; var success = Double.TryParse( str , NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite | NumberStyles.AllowL

尚未发现类似的问题(关于“$”)

下面,我尝试扩展一个预先存在的方法,将字符串转换为双精度字符串。代码的总体结构如下所示:

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);
这很有效。我遇到的问题是当
Double.TryParse()
方法的
IFormatProvider
设置为
CultureInfo.InvariantCulture
NumberFormatInfo.InvariantInfo
时,如何处理“$”字符

(即,用注释掉的变量之一替换方法调用中的
null


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

有一个带有
NumberStyles.AllowLeadingSign
的通知,您只需遵循它,在这里您只需使用
新系统.Globalization.NumberFormatInfo(){currencycsymbol=“$”}
替换您的
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);

有一个带有
NumberStyles.allowReadingSign
的通知,您只需遵循它,您只需使用
new System.Globalization.NumberFormatInfo(){currencycsymbol=“$”}
替换您的
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);
为什么呢

不变区域性的货币符号是
·而不是美元符号。这就是它失败的原因

但是,您不需要修改转换代码,但可以修改传入的字符串

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
为什么呢

不变区域性的货币符号是
·而不是美元符号。这就是它失败的原因

但是,您不需要修改转换代码,但可以修改传入的字符串

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

你是在问为什么或者你是在问如何修复它?如何修复它是关于主题的。MS为什么做出这样的决定并不真正是关于主题的,除非推理背后有一些官方文件。否则,这仅仅是猜测和意见。基于上下文,我相信所问的问题是“我不明白为什么……”不是“为什么微软。。。"-这绝对是一个很好的观点。你是否在问为什么或者你在问如何修复它?如何修复它是关于主题的。MS为什么做出这样的决定并不真正是关于主题的,除非推理背后存在一些官方文件。否则,这仅仅是猜测和意见。基于上下文,我相信问题被问到的是“我不明白为什么……”而不是“微软为什么……”——不管怎样,这绝对是一个很好的观点