gpt4 book ai didi

C# string to Decimal On All style or 文化

转载 作者:行者123 更新时间:2023-12-02 14:53:46 27 4
gpt4 key购买 nike

你好,我想看看是否有更好的方法将字符串解析为涵盖各种格式的 Decimal

  1. 1.30 美元
  2. 1.50 英镑
  3. 2,50 欧元
  4. 2,50 €
  5. 2.500,00 €

我看到很多用culture来转换. & ,的例子。但就我而言,我没有任何东西可以识别文化。

我从客户端获取的这个显示字段,我需要提取值。

我尝试了以下方法(并非适用于所有情况)但想知道我们是否有任何最佳方法来处理此问题。

Decimal.Parse(value,NumberStyles.Currency |
NumberStyles.Number|NumberStyles.AllowThousands |
NumberStyles.AllowTrailingSign | NumberStyles.AllowCurrencySymbol)

我还尝试使用 Regex 删除货币符号,但无法在一个逻辑中同时转换 1.8 或 1,8。

最佳答案

好吧,假设您始终获得有效的货币格式,并且只是文化发生了变化,您可以猜测哪个字符用作小数点,哪个字符用作千位分隔符,方法是检查出现在数字的最后。然后删除所有千位分隔符并像文化不变一样解析它。

代码如下所示:

// Replace with your input
var numberString = "2.500,00 €";

// Regex to extract the number part from the string (supports thousands and decimal separators)
// Simple replace of all non numeric and non ',' '.' characters with nothing might suffice as well
// Depends on the input you receive
var regex = new Regex"^[^\\d-]*(-?(?:\\d|(?<=\\d)\\.(?=\\d{3}))+(?:,\\d+)?|-?(?:\\d|(?<=\\d),(?=\\d{3}))+(?:\\.\\d+)?)[^\\d]*$");

char decimalChar;
char thousandsChar;

// Get the numeric part from the string
var numberPart = regex.Match(numberString).Groups[1].Value;

// Try to guess which character is used for decimals and which is used for thousands
if (numberPart.LastIndexOf(',') > numberPart.LastIndexOf('.'))
{
decimalChar = ',';
thousandsChar = '.';
}
else
{
decimalChar = '.';
thousandsChar = ',';
}

// Remove thousands separators as they are not needed for parsing
numberPart = numberPart.Replace(thousandsChar.ToString(), string.Empty);

// Replace decimal separator with the one from InvariantCulture
// This makes sure the decimal parses successfully using InvariantCulture
numberPart = numberPart.Replace(decimalChar.ToString(),
CultureInfo.InvariantCulture.NumberFormat.CurrencyDecimalSeparator);

// Voilá
var result = decimal.Parse(numberPart, NumberStyles.AllowDecimalPoint | NumberStyles.Number, CultureInfo.InvariantCulture);

对于简单的十进制解析来说,它确实看起来有点复杂,但我认为应该对您获得的所有输入数字或至少其中的大部分进行处理。

如果您在某种循环中执行此操作,您可能需要使用已编译的正则表达式。

关于C# string to Decimal On All style or 文化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54128799/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com