【问题标题】:Cannot perform an operation with converted label text无法使用转换后的标签文本执行操作
【发布时间】:2015-07-20 22:39:33
【问题描述】:

我有点卡住了:我正在尝试执行一个 if 语句来比较一个 label.text,该 label.text 最初具有从 .ToString("C"); 创建的货币字符串

和一个小数。我尝试将标签转换为十进制,因为我要将它与小数进行比较,但它一直触发异常:

输入字符串的格式不正确。

这是我当前的代码:

if(Convert.ToDecimal(SomeLabel.Text) > 1000.00m) { //DO SOMETHING } 
//SomeLabel.Text has a value of $1000.00

【问题讨论】:

  • SomeLabel.Text 的值是多少,你的CurrentCulture 是什么?
  • 最好访问原始十进制值。您是否将其存储在其他可以比较的地方?也许您甚至可以将Tag标签与decmial同时设置为格式化字符串
  • @SonerGönül 如代码说明所示,//SomeLabel.Text 的值为 $1000.00

标签: c# winforms


【解决方案1】:

//SomeLabel.Text 的值为 $1000.00

美元符号是问题的原因。 Yoa 可能使用不同的货币符号。您可以使用decimal.Parse/decimal.TryParse(处理无效输入)强制它:

string input = "$1000.00";
decimal decimalValue;
if(decimal.TryParse(input, out decimalValue))
{
    // using current CurrencySymbol, same as Convert.ToDecimal
    Console.WriteLine("Converted successfully: " + decimalValue);
}
else
{
    var usCulture = new CultureInfo("en-US");
    if (decimal.TryParse(input, NumberStyles.Currency, usCulture, out decimalValue))
    {
        // using dollar sign as CurrencySymbol
        Console.WriteLine("Converted successfully with CultureInfo(en-US): " + decimalValue);
    }
    else
    {
        Console.WriteLine("Could not be parsed to decimal");
    }
}

输出:

Converted successfully with CultureInfo(en-US): 1000.00

值得注意的是NumberFormatInfo.InvariantInfo.CurrencySymbol 不返回美元符号(我的想法)而是¤

【讨论】:

    【解决方案2】:

    Convert.ToDecimal 明确使用decimal.Parse 此方法使用NumberStyles.Number默认情况下

    这是一个复合样式,包括AllowDecimalPoint,但不包括AllowCurrencySymbol 样式甚至如果您的CurrentCultureCurrencySymbol$ 并且NumberDecimalSeparator.

    您可以使用decimal.parse(String, NumberStyles, IFormatProvider) overlaod 将这些作为参数,例如;

    string s = "$1000.00";
    var d = decimal.Parse(s, NumberStyles.AllowCurrencySymbol | NumberStyles.AllowDecimalPoint, 
                          CultureInfo.GetCultureInfo("en-US"));
    

    d解析后会是1000

    【讨论】:

    • 做得很好,效果很好。太糟糕了,没有其他人支持你并使用更复杂的解决方案!
    【解决方案3】:

    根据您的示例。您的字符串值为 $1000.00

    这包含一个 $ 符号,这就是编译器无法将字符串转换为十进制的原因。

    尝试通过替换删除不可用的字符。或者试试下面的方法

    Regex digitsOnly = new Regex(@"[0-9.]");  // this regex matches only digits and decimal 
    string decimalnumberstring = digitsOnly.Replace(SomeLabel.Text, "");// replace all non numbers (except decimal) with empty string
    

    然后尝试转换字符串值,如下所示。

    if(Convert.ToDecimal(decimalnumberstring) > 1000.00m) { //DO SOMETHING }
    

    希望对你有帮助....

    【讨论】:

    • 这包含一个 $ 符号,这就是编译器无法将字符串转换为十进制的原因 这不是真的。这是解析,而不是强制转换。它们真的不同。
    • $ 符号是从 .ToString("C") 附加的。正则表达式能用吗?
    • @JoshuaMasangcay C is standard numeric format。这意味着您已经有一个数值。为什么要生成它的字符串表示并将其解析回来?为什么不使用 那个 值呢?
    【解决方案4】:

    首先从你的文本中去掉美元符号:

    来源:1000 美元

    double result = 0M;
    String value = SomeLabel.Text.Substring(1);
    if (Double.TryParse(value, out result)) {
        //
    }
    return result;
    

    【讨论】:

    • 仍然不能保证用他的CurrentCulture解析1000.00字符串。
    • 也许吧。他的帖子仅显示 SomeLabel.Text 的价值为 $1000.00。如果他所有的货币值都是这种格式,那么去掉第一个字符是最简单的方法。在他的个人资料中,我看到他来自菲律宾。没有提及他的当前文化设置。
    【解决方案5】:

    试试这个

    if(decimal.Parse(SomeLabel.Text) > 1000.00m)
    {
    
    }
    

    【讨论】:

    • 这和Convert.ToDecimal(SomeLabel.Text)一样。
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多