2

しばらく悩まされている問題があります。いくつかの解決策を試しましたが、うまくいきませんでした。

現金入力用のテキストボックスがあります(たとえば、$ 999,99)。ただし、「、」と「。」を自動的に入力する必要があります。値を正しく表示します。

私は2つの解決策を試しました。それらの1つはこれです:

   private void tx_ValorUnidade_TextChanged(object sender, EventArgs e)
    {
        string value = tx_ValorUnidade.Text.Replace(",", "").Replace("R$", "");
        decimal ul;
        //Check we are indeed handling a number
        if (decimal.TryParse(value, out ul))
        {
            //Unsub the event so we don't enter a loop
            tx_ValorUnidade.TextChanged -= tx_ValorUnidade_TextChanged;
            //Format the text as currency
            tx_ValorUnidade.Text = string.Format(System.Globalization.CultureInfo.CreateSpecificCulture("pt-BR"), "{0:C2}", ul);
            tx_ValorUnidade.TextChanged += tx_ValorUnidade_TextChanged;
        }
    }

しかし、結果は非常に奇妙です。

もう1つはこれです:

    private void tx_ValorUnidade_KeyUp(object sender, KeyEventArgs e)
    {
          if (!string.IsNullOrEmpty(tx_ValorUnidade.Text))
          {
              System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo("en-US");
              int valueBefore = Int32.Parse(tx_ValorUnidade.Text, System.Globalization.NumberStyles.AllowThousands);
              tx_ValorUnidade.Text = String.Format(culture, "{0:N0}", valueBefore);
              tx_ValorUnidade.Select(tx_ValorUnidade.Text.Length, 0); *
          }
    }

これはちょっと機能しますが、問題があります: ユーザーが $10,00 のようなものを挿入したい場合、それはできません。また、5 桁の後にクラッシュします。

元の参照用に、ここで他の 質問から2つのコードを取得しました。

どうすれば修正できますか?例を間違って使用していますか? どんな考えでも大歓迎です。

4

6 に答える 6

12

入力時にテキストボックスを実際にフォーマットしたい人もいるでしょう。誰かが探しているなら、これが私の解決策です。

実際には、一度に 1 桁ずつ入力していると想定されるため、「1」を押すと「$0.01 」と想定され、「 2 」を押すと「 $0.12 」と想定されます。

彼らが入力したフォーマットについては、オンラインで何も見つかりませんでした。テスト済みで、エラーがあればお知らせください。

private void textBox1_TextChanged(object sender, EventArgs e)
{
    //Remove previous formatting, or the decimal check will fail including leading zeros
    string value = textBox1.Text.Replace(",", "")
        .Replace("$", "").Replace(".", "").TrimStart('0');
    decimal ul;
    //Check we are indeed handling a number
    if (decimal.TryParse(value, out ul))
    {
        ul /= 100;
        //Unsub the event so we don't enter a loop
        textBox1.TextChanged -= textBox1_TextChanged;
        //Format the text as currency
        textBox1.Text = string.Format(CultureInfo.CreateSpecificCulture("en-US"), "{0:C2}", ul);
        textBox1.TextChanged += textBox1_TextChanged;
        textBox1.Select(textBox1.Text.Length, 0);
    }
    bool goodToGo = TextisValid(textBox1.Text);
    enterButton.Enabled = goodToGo;
    if (!goodToGo)
    {
        textBox1.Text = "$0.00";
        textBox1.Select(textBox1.Text.Length, 0);
    }
}

private bool TextisValid(string text)
{
    Regex money = new Regex(@"^\$(\d{1,3}(\,\d{3})*|(\d+))(\.\d{2})?$");
    return money.IsMatch(text);
}

見栄えを良くするために、次のように、フォームの読み込み時に $0.00 というテキストでテキスト ボックスを開始することをお勧めします。

    private void Form1_Load(object sender, EventArgs e)
    {
        textBox1.Text = "$0.00";
        textBox1.SelectionStart = inputBox.Text.Length;
    }
于 2013-12-02T16:46:17.587 に答える
11

以下のように、ユーザーが次のコントロールに移動したときにフォーマットする方が良いと思います。そうしないと、ユーザーが入力しているときにテキストが自動的に変化するため、非常に混乱します。

    private void textBox1_Leave(object sender, EventArgs e)
    {
        Double value;
        if (Double.TryParse(textBox1.Text, out value))
            textBox1.Text = String.Format(System.Globalization.CultureInfo.CurrentCulture, "{0:C2}", value);
        else
            textBox1.Text = String.Empty;
    }
于 2013-10-07T02:01:42.040 に答える
1

次のものも試すことができます。

txtCost.Text = String.Format("{0:c2}", myObj.Cost);
于 2018-01-18T10:30:33.840 に答える