12

ApacheのStringUtils.isNumeric()メソッド仕様は次の
ように述べています。文字列にUnicodeの数字のみが含まれているかどうかを確認します。小数点はUnicode桁ではなく、を返しますfalseNullを返しfalseます。空の場合は。String ("")を返しtrueます。

これは論理的に正しいですか?なぜ彼らは空の文字列を数値として見るのですか?

4

6 に答える 6

14

3.0では動作が変更されました。CommonsLang3.0の新機能から :

StringUtils.isAlpha、isNumeric、およびisAlphanumericは、空の文字列が渡されたときにすべてfalseを返すようになりました。以前はtrueを返していました。

参考のため、および3.0より前のユーザーのために、以下の古い回答を保持します。


これは論理的に正しいですか?

我々は持っています

  1. メソッドの動作
  2. メソッドのドキュメント(仕様または契約と見なされることが多い)
  3. メソッドの名前

この場合、1と2は互いに一致します。空の文字列のすべての文字はUnicode数字です。(または、同等に、空の文字列内のどの文字もUnicode数字ではありません。)これは、論理学者が空虚な真であり、やや直感に反していると呼んでいます。私のアパートの象はすべて緑だと言っているようなものです。私のアパートには象がいないので、それは本当です。

ただし、項目3(メソッドの名前)は、指定された文字列が数値を表す場合にtrueを返すメソッドとして自然に解釈されます。

つまり、それはドキュメントと実装のバグであるか、名前のバグです。それに対する正しい答えも間違った答えもありません。

ここにバグが報告されました。メンテナは、それが意図された振る舞いであるという立場を取ります。

なぜ彼らは空の文字列を数値として見るのですか?

メソッドの名前から、メソッドは数値を表す文字列に対してのみtrueを返す必要があると思われるかもしれませんが、仕様では、文字列にUnicodeの数字のみが含まれている場合はtrueを返す必要があると実際に示されています。

あなたは言う、

仕様に「文字列にUnicodeの数字しか含まれていないかどうかをチェックする」と書かれているため、混乱しています。「」に数字が含まれているのがわかりません。

空の文字列には、Unicodeの数字以外は含まれていないことに注意してください。したがって、メソッドはtrueを返します。

于 2010-10-20T12:40:38.677 に答える
7

この質問をしたのは私だけではありません:)人々はApacheのJiraでこの欠陥を開いていました: https ://issues.apache.org/jira/browse/LANG-428

下位互換性を維持するためだけに(メソッドの仕様に従うために)修正せずに閉じました。

しかし、誰もがメソッドの現在の動作が間違っていることに同意しました。

于 2010-10-20T16:15:18.160 に答える
6

java.lang.Integer.parseInt("")失敗します。

それは論理の問題ではありません。それも常識の問題ではありません-記号なしで表される数字はありませんでした。空の文字列が0を表す必要がある理由についての強い議論はありません。

メソッド名がcontainsOnlyNumeric()、の場合、数学の教科書によれば、「」に対してtrueを返すのは自然なことです。ただし、メソッド名はisNumeric()、「」の扱いは自然ではありません。nullまた、 falseを返す必要がある明確な理由はありません。nullの例外をスローします。

しかし、それはそれが何であるかであり、それは十分に文書化されており、あなたはこれ以上何を求めることができますか?

于 2010-10-20T15:50:23.960 に答える
4

まず、文字列がempty()であるかどうかの条件を確認します。

if(StringUtils.isNotEmpty(str) && StringUtils.isNumeric(str)) {

}

その後、あなたの問題は解決されます。

しかし、さらにもう1つの問題は、次のような負の値を渡すことです。

str = "-1";

StringUtils.isNumeric(str)それは誤りになります。

この状態に注意する必要があります。

于 2014-04-17T07:41:59.837 に答える
0

別の解決策があります。NumberUtils.isNumber これは、Long、Double、Integerのいずれかの数値であるかどうかをチェックします。

この助けを願っています

于 2015-07-28T08:02:48.013 に答える
0

Commons Lang 3.5の時点で、NumberUtils.isCreatableがこれを行う方法です。詳細については、この回答を参照してください。

于 2020-04-17T18:08:40.063 に答える