【问题标题】:How to compare currency or alphanumeric values in C#如何在 C# 中比较货币或字母数字值
【发布时间】:2016-12-21 10:21:21
【问题描述】:

从应用程序中提取的值是字符串格式,例如。 “0.38 美元”。因此,我使用 IsDigit 分隔给定字符串中的每个字符,然后使用字符串生成器将它们附加在一起。该数字也可以是字母数字,例如“12,365.23 AS”。有没有办法从给定的字符串中只恢复数字部分(连同小数部分)。 但我收到的输出是“38”而不是“0.38”。我还想比较给定的字符串值位于提供的上限和下限之间。 请让我知道如何继续。

string Value = "$0.38";

int upperLimit = 2500;
int lowerLimit = 50000;

StringBuilder sb = new StringBuilder();
//sb.Append(someString);
foreach (char amin in Value)
{
    if (System.Char.IsDigit(amin))
    {
        sb.Append(amin);
    }
}
int compareVal = Convert.ToInt32(sb.ToString());

Console.WriteLine("value for comparision" + " " + compareVal);

【问题讨论】:

  • Int32 是存储货币的简单错误类型。使用double
  • 您可以改为从字符串中剥离货币指示符并将其直接转换为双精度
  • 这是因为'.'不是数字,它会给出 038 转换时会产生 38 而不是 0.38

标签: c#


【解决方案1】:

最好的方法是使用decimal.Parse的重载之一:

string Value = "$0.38";
CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");

decimal dd=decimal.Parse(Value, System.Globalization.NumberStyles.AllowCurrencySymbol|System.Globalization.NumberStyles.AllowDecimalPoint,culture);

注意NumberStyles enum的使用。这样你可以控制解析的精确度。

【讨论】:

  • 请不要将货币解析为double,使用decimal 以支持像0.1 这样的便士值。
【解决方案2】:

你会得到38的原因有两个:

  1. StringBuilder 看起来像 "038",因为 "." 不是数字(就像 "$")。
  2. Convert.ToInt32(...) 返回一个不允许小数位的整数。

比较好的货币数据类型是decimal,可以说是一种高精度浮点数据类型。

试试

var amount = decimal.Parse(Value , NumberStyles.Currency)
var isInLimit = upperLimit <= amount && amount <= lowerLimit; // i guess you swapped upper and lower limit btw. ;)

改为。

编辑

为了使用NumberStyles-Enumeration,您必须在文件中使用正确的命名空间:

using System.Globalization;

【讨论】:

  • 如果您有一个 0,000.00 格式的数字,这不会引起问题吗? (只问,因为 OP 说它是一个字符串值)
  • 没有。这种情况由当前的文化处理。如果您当前文化的数字样式不同,则需要传递正确的文化信息。
  • "名称'NumberStyles'在当前上下文中不存在"
  • 很高兴能帮上忙!
【解决方案3】:

您省略了小数点,并且您没有使用十进制数据类型来保存转换后的值。真正的方法是将货币字符串转换为十进制数:

CultureInfo usCulture = new CultureInfo("en-US)";
decimal amount = decimal.Parse(Value, NumberStyles.Currency, usCulture);

然后您可以执行适当的数字比较:

if (amount <= upperLimit && amount >= lowerLimit)
    ....

我首先将问题标记为重复,但后来改变了主意。我仍然认为它与:Convert any currency string to double

【讨论】:

  • 当我尝试使用这个时,我得到“名称'NumberStyles'在当前上下文中不存在”这个错误
  • @Ansh 你需要添加System.Globalization命名空间,当然……
  • 让我们说如果字符串是字母和数字组合的形式,那么如何进行?因此,我使用了字符串生成器。
  • 让我们说如果字符串是字母和数字组合的形式,那么如何进行?因此,我使用了字符串生成器。可以说它是“abcd1,002.38”。你能帮我解决这个问题吗?
  • 好吧,如果字符串的格式不遵循给定的货币格式,事情就会变得有点困难。在这种情况下,它有点取决于数字格式,但我想我会限制可能的字符数,例如数字、+、-、逗号和句点,并使用您的字符串生成器方法和数字转换后缀,或者我会寻找一个从字符串中提取十进制数字并在数字转换和比较之前使用它的正则表达式。
猜你喜欢
  • 1970-01-01
  • 2011-12-23
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多