C# 将字符串转换为十进制-保留数字

C# 将字符串转换为十进制-保留数字,c#,C#,我有一个表单,允许用户输入价格,例如,10.00 但是,由于表单是purley文本,用户可以为book输入$10.00或10.00。 我无法更改UI,这必须在引擎盖下完成。 所以基本上,无论使用什么类型,我只想要一个十进制结果 我开始这样做 public decimal FilterPrice(dynamic price) { string convertPrice=price.ToString(); var filterNumber= from letter

我有一个表单,允许用户输入价格,例如,
10.00

但是,由于表单是purley文本,用户可以为book输入
$10.00
10.00。
我无法更改UI,这必须在引擎盖下完成。
所以基本上,无论使用什么类型,我只想要一个十进制结果

我开始这样做

public decimal FilterPrice(dynamic price) {
    string convertPrice=price.ToString();

    var filterNumber=
        from letter in convertPrice
        where char.IsDigit(letter)
        select letter;

    return something;
}

但是,这将去掉
。有什么办法吗

您可以用一个简单的正则表达式来解决它

    public bool TryGetPreisAsDecimal(string price, out decimal convertedPrice)
    { 
        Match match = Regex.Match(price,@"\d+(\.\d{1,2})?");

        if (match != null)
        {
            convertedPrice = decimal.Parse(match.Value);
            return true;
        }
        else
        {
            convertedPrice = 0.0m;
            return false;
        }
    }

你可以用一个简单的正则表达式来解决这个问题

    public bool TryGetPreisAsDecimal(string price, out decimal convertedPrice)
    { 
        Match match = Regex.Match(price,@"\d+(\.\d{1,2})?");

        if (match != null)
        {
            convertedPrice = decimal.Parse(match.Value);
            return true;
        }
        else
        {
            convertedPrice = 0.0m;
            return false;
        }
    }

为什么不能在UI中执行此操作?你应该尽可能早地限制你的输入,不要让用户输入任何他们想要的内容,然后试图弄明白他们的意思。如果我使用您的应用程序并键入“10.00 foo 11 bar 1.1.10baz”会怎么样?老实说,我会修剪、删除$sign,如果它仍然无效,我会抛出一个异常。是的,通过允许额外的输入,它会为您创建更多的错误处理代码。如果你能过滤一个大容量,它将运行得更平稳,花费的时间更少。如果你要允许任何自由格式的文本,你将不得不做一些解析,要么逐个字符,要么使用正则表达式。在任何一种情况下,你都必须拿出你想要的规则来判定某个东西是“有效的”。不仅是文本,而且如果这是一个区域化的应用程序,你还必须考虑不同的货币符号、小数点分隔符等。这可能会有点混乱。这绝对是一个用户界面的改变。“一本书的10.00”应分为两个单独的字段——成本(10.00)和原因(“一本书”)。否则你会遇到各种各样的问题。为什么不能在UI中完成呢?你应该尽可能早地限制你的输入,不要让用户输入任何他们想要的内容,然后试图弄明白他们的意思。如果我使用您的应用程序并键入“10.00 foo 11 bar 1.1.10baz”会怎么样?老实说,我会修剪、删除$sign,如果它仍然无效,我会抛出一个异常。是的,通过允许额外的输入,它会为您创建更多的错误处理代码。如果你能过滤一个大容量,它将运行得更平稳,花费的时间更少。如果你要允许任何自由格式的文本,你将不得不做一些解析,要么逐个字符,要么使用正则表达式。在任何一种情况下,你都必须拿出你想要的规则来判定某个东西是“有效的”。不仅是文本,而且如果这是一个区域化的应用程序,你还必须考虑不同的货币符号、小数点分隔符等。这可能会有点混乱。这绝对是一个用户界面的改变。“一本书的10.00”应分为两个单独的字段——成本(10.00)和原因(“一本书”)。否则,您将遇到各种类似的问题。我会将此设置为TryGet方法,因为用户输入的“$0.00每本书”的值无法与“$per book”区分开来一个名为
TryXxx
的方法将按惯例返回
bool
值。只需投入我的两分钱——这个正则表达式不允许我投入我的“.02”。不过,它会让我加入我的“0.02”,所以这也不算太糟糕。我会将其作为一个TryGet方法,因为用户输入的“$0.00每本书”的值无法与“$per book”区分开来一个名为
TryXxx
的方法将按惯例返回
bool
值。只需投入我的两分钱——这个正则表达式不允许我投入我的“.02”。不过,它会让我加入我的“0.02”,所以这并不太糟糕。