0

テキストボックスに数値を入力したいのですが、テキストボックスは自動的にカンマ(、)形式に変換します。私はこれをやろうとしましたが、うまくいきません。助けて?このように 1,20(I JUST ENTER 120);

private bool IsNumeric(int Val)
{
    return ((Val >= 48 && Val <= 57) || (Val == 8) || (Val == 46));
}
String str;
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    int KeyCode = e.KeyValue;
    if (!IsNumeric(KeyCode))
    {
        if (KeyCode == 13)
        {
            e.Handled = true;
            vendas();
            str = null;
        }
        e.Handled = true;
        return;

    }
    else
    {
        e.Handled = true;
    }
    if (((KeyCode == 8) || (KeyCode == 46)) && (str.Length > 0))
    {
        str = str.Substring(0, str.Length - 1);
    }
    else if (!((KeyCode == 8) || (KeyCode == 46)))
    {
        str = str + Convert.ToChar(KeyCode);
    }

    if (str.Length == 0)
    {
        textBox1.Text = "";
    }
    if (str.Length == 1)
    {
        textBox1.Text = "0,0" + str;
    }
    else if (str.Length == 2)
    {
        textBox1.Text = "0," + str;
    }
    else if ((str.Length > 2) && (str.Length != 6) && (str.Length != 9) && (str.Length != 12))
    {
        textBox1.Text = str.Substring(0, str.Length - 2) + "," + str.Substring(str.Length - 2);
        textBox1.Text = textBox1.Text;
    }
    else if ((str.Length > 6) && (str.Length != 8) && (str.Length != 10) && (str.Length != 12))
    {
        textBox1.Text = str.Substring(0, str.Length - 3) + "," + str.Substring(str.Length - 1);
        textBox1.Text = textBox1.Text;
    }
}

0,01 ではなく 10,01 と表示されますか?

4

3 に答える 3

1

必要なのはMaskedTextBoxです。

単純なマスクのセットと"$999,999,990.00"、ユーザーが入力する入力は数字である必要があり、少なくとも 3 つある必要がありますが、エントリは数億までの任意の数にすることができます (10 億と 1 兆が必要な場合は、さらに 9 とコンマを追加するだけです) )。ユーザーがこれらの数字を入力すると、マスクに基づいてフォーマットが調整されます。これがキッカーです。MaskedTextBox はカルチャ情報を尊重するため、フランスのカルチャを指定すると、コンマがスペースに、小数点がコンマに、ドル記号がユーロ記号になります。

于 2012-08-10T21:42:02.460 に答える
1

当初は MaskedTextBox を提案するつもりでしたが、MTB は固定長 (または少なくとも上級者には知られている) の長さの文字列の左から右へのスタイルの書式設定用に設計されているため、通貨にはあまり適していません。

まず、キーコードなどを使用することは避け、テキストが変更されたときにテキストを検証して編集するだけで、もう少し簡単なことに固執することをお勧めします。

    void tb_TextChanged(object sender, EventArgs e)
    {
          //Remove previous formatting, or the decimal check will fail
      string value = tb.Text.Replace(",", "").Replace("$", "");
      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
        tb.TextChanged -= tb_TextChanged;
            //Format the text as currency
        tb.Text = string.Format(CultureInfo.CreateSpecificCulture("en-US"), "{0:C2}", ul);
        tb.TextChanged += tb_TextChanged;
      }
    }

例

主な部分はstring.Format(CultureInfo.CreateSpecificCulture("en-US"), "{0:C2}", ul);en-US であり、常に $ と 10 進数が '.' として表示されます。は、文字列を通貨 ( ) の数値 ( ) から 2 つの小数点以下のスペース ( ) に{0:C2}フォーマットします。0:C2

これにより、ユーザーがテキストを入力できなくなるわけではありませんが、以前のテキスト (例: '$23.00') を保持することができ、ユーザーが数値以外の何かを入力した場合、decimal.TryParse は失敗します。テキストをユーザーが変更する前の状態に戻します (このイベント ハンドラーの末尾近くに else ブロックを挿入するだけです)。

最初に TB テキストを「$0.00」などに設定することをお勧めします。そうしないと、最初の変更をフォーマットするときにカーソルがジャンプします。また、カンマが追加されているときに選択の問題がいくつかあります。これは、フォーマットの直前に選択位置を保存して後で変更するか、より複雑なことを行うことで回避できます。これは単なる例です。

于 2012-08-10T22:13:48.887 に答える
-1

一見しただけでは、あなたのコードには何の意味もないことがわかります。

何よりもまず、インデントのコーディング標準を学びます。このコードは非常に読みにくいです。この質問は、見なければならなかったことに対して攻撃的であるとフラグを立てたくなりました。

次に、この行:

if (!IsNumeric(KeyCode){

言う: キーコードが数値でない場合は、次のことを行います。ここで、「次のこと」は、数値であると推定されるキーコードに対する一連の数値操作です。

次に、strメソッドのどこにも定義されていません。グローバルに定義されているのかもしれませんが、それはばかげています。むしろ、プログラムで現在の値を取得する必要があります。

最後に、一からやり直す必要はありません。この種のことを行うツールはたくさんあります。実際、勝利フォームにはこれを行うネイティブ コントロールがあると確信しています。テキストボックスの属性でさえあるかもしれませんが、覚えていません。

于 2012-08-10T21:46:34.073 に答える