0

ロケールが fr に設定されている GWT プロジェクトがあります。数値入力の検証と書式設定に数値書式を使用するカスタム テキスト フィールドがあります。

フォーマットは正常に機能しますが、入力の検証は機能しません。新しい値が有効なパーセンテージであることを検証するメソッドのスナップショットを次に示します (これは onValueChanged と呼ばれます)。

    private void validateNumber(String newVal){
    logger.debug("value changed, newVal="+newVal+", current="+current);
    // Attempt to parse value
    double val=0;
    try{
        val=Double.parseDouble(newVal);
    }catch(NumberFormatException e){
        logger.warn("parsing failed",e);
        try{
            val=getFormatter().parse(newVal);
        }catch(NumberFormatException ex){
            logger.warn("parsing with nb format failed",ex);
            // on failure: restore previous value
            setValue(current,false);


            return;
        }
    }
      //some check on min and max value here
}

たとえば、プログラムによって開始値が「0.2」に設定されている場合、20,00 % と表示されるため、正しい小数点記号が使用されます。今:

  • 0,1 を入力すると、numberformat 例外が発生します。
  • 0.1 を入力すると、10,00 % と表示されます
  • 10% (「%」の前のスペースなし) の場合、numberformat 例外が発生します。

0、1、および 10% が有効な入力として識別されるようにメソッドを変更する方法を知っていますか?

4

2 に答える 2

0

コードを次のように変更することで、なんとか機能させることができました。

private void validateNumber(String newVal){
    double val=0;
    try{
        val=getFormatter().parse(newVal);
    }catch(NumberFormatException e){
        boolean ok=false;
        try{
            val=NumberFormat.getDecimalFormat().parse(newVal);
            ok=true;
        }catch(NumberFormatException e1){}
        if(!ok){
            try{
                val=Double.parseDouble(newVal);

            }catch(NumberFormatException ex){
                setValue(current,false);
                // inform user
                Window.alert(Proto2.errors.myTextField_NAN(newVal));
                return;
            }
        }
    }
于 2013-07-13T13:04:47.450 に答える
0

Colin が述べたように、Double ではなく GWT Number Format オブジェクトを使用して解析およびフォーマットする必要があるため、解析とフォーマットは適切にロケール固有になります。

以下は、パーセント数を解析、検証、フォーマットするために見つけたいくつかのコード スニペットです。

ただし、編集プロセスでは % 単位がテキスト ボックスの値の外側にハードコードされていることに注意してください。したがって、編集プロセスでは 20.45% と 0.2045 の間の変換は行われず、20.45 が直接入力され、そのまま視覚化されます。編集過程でこのような変換に苦労したことをぼんやりと覚えていますが、しばらく前のことなので詳細を忘れてしまいました。したがって、それがあなたの質問と要件の重要な部分である場合、以下の例は価値が限られている可能性があると思います. とにかく、ここにいます!

表記法:

TextBox txt = new TextBox();
NumberFormat _formatFloat = NumberFormat.getFormat("#,##0.00");
NumberFormat _formatPercent = NumberFormat.getFormat("##0.00%");

"20,45" のようなテキスト エントリを 20.45 として解析する ("20,45%" を 0.2045 としてではなく):

txt.setText("20,45"); // French locale format example, % symbol hard-coded outside of text box.
try {
  float amount = (float) _formatFloat.parse(txt.getText());
} catch (NumberFormatException e) ...

「20,45」などのテキスト エントリの解析と検証:

private class PercentEntryValueChangeHandler implements ValueChangeHandler<String>
{
  @Override
  public void onValueChange(ValueChangeEvent<String> event)
  {
    validatePercent((TextBox) event.getSource());
  }
};

private void validatePercent(final TextBox percentTextBox)
{
  try
  {
    if (!percentTextBox.getText().isEmpty())
    {
      final float val = (float) _formatFloat.parse(percentTextBox.getText());
      if (isValid(val))
        percentTextBox.setText(_formatFloat.format(val));
      else
      {
        percentTextBox.setFocus(true);
        percentTextBox.setText("");
        Window.alert("Please give me a valid value!");
      }
    }
  }
  catch (NumberFormatException e)
  {
    percentTextBox.setFocus(true);
    percentTextBox.setText("");
    Window.alert("Error: entry is not a valid number!");
  }
}

private boolean isValid(float val) { return 12.5 < val && val < 95.5; }

txt.addValueChangeHandler(new PercentEntryValueChangeHandler());

20.45 を "20,45" にフォーマット:

float val = 20.45;
txt.setText(_formatFloat.format(val));

0.2045 を "20,45%" としてフォーマットします (読み取り専用プロセス、テキスト ボックスは編集不可、% はテキスト ボックス内に設定されます):

float val = 0.2045;
txt.setText(_formatPercent.format((double)(val))); // * 100 embedded inside format.

それは空想的ではなく、おそらく完璧にはほど遠いですが、うまくいきます! この実装を改善する方法についてのフィードバックは大歓迎です。とにかく役立つことを願っています。

于 2013-06-28T16:55:04.293 に答える