0

double型を通貨として表示するために ValueConverter を使用しています。エントリが有効であることを確認したいので、私が作成したこの検証方法を使用してみました。私の唯一の問題は、値全体 (つまり $500.00) を選択して何も入力できないことです。「$」が選択されていない場合、すべて問題ないようです。どうすればこれを修正できますか?

XAML:

<TextBox Text="{Binding Converter={StaticResource MoneyConverter}, Path=fr}"
  PreviewTextInput="ValidateMoney" DataObject.Pasting="TextBox_Pasting"/>

コードビハインド:

private void ValidateMoney(object sender, TextCompositionEventArgs e) {
  Regex rgx = new Regex(@"^(\$)[0-9]*[.]{0,1}[0-9]*$|^[.][0-9]+$|^[0-9]*[.]{0,1}[0-9]*$");
  e.Handled = !rgx.IsMatch((sender as TextBox).Text.Insert((sender as TextBox).SelectionStart, e.Text));
}
public class MoneyConverter : IValueConverter {
  public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
    if (value != null) {
      double d;
      string temp = value.ToString();
      if (double.TryParse(temp, out d)) {
        return String.Format("{0:C}", d);
      } else {
        return value;
      }
    } else {
      return value;
    }
  }
  public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
    if (value != null) {
      double d;
      string temp = value.ToString();
      if (double.TryParse(temp, out d)) {
        return String.Format("{0:C}", d);
      } else {
        return value;
      }
    } else {
      return value;
    }
  }
}
4

1 に答える 1

3

かっこは不要ですが、ドル記号を含める方法は正しいです。これを書くだけで十分です:^\$

正規表現を大幅に簡略化できます。

  • 交互に3つの別々のケースは必要ありません。そこには不必要な繰り返しがあります。
  • {0,1}に置き換えることができます?
  • おそらく、少なくとも1桁あることを確認する必要があります。

これを試して:

@"^\$?(?:[0-9]+(?:\.[0-9]+)?|\.[0-9]+)$"

または、キャプチャグループを使用して混乱を減らします。

@"^\$?([0-9]+(\.[0-9]+)?|\.[0-9]+)$"

他のいくつかのポイント:

  • TryParseあなたはそれが現在の文化の影響を受けていることに注意する必要があります。1.990あなたの文化に応じて異なることを意味します。
  • ToString文化にも依存します。この"{0:C}"形式はドル記号を保証するものではありません。
  • 正規表現では、のようなことができます$.990。それはあなたが望むものかもしれませんが、それは私には少し奇妙に見えます。
  • 金額を保存するdecimalのではなく、おそらく使用する必要があります。タイプは正確に保存できませんがdouble、保存できます。double1.99decimal
  • [.]同等のものに交換しました\.が、それは好みの問題です。どちらも同じことをします。
于 2012-11-12T20:37:13.017 に答える