ApacheのStringUtils.isNumeric()
メソッド仕様は次の
ように述べています。文字列にUnicodeの数字のみが含まれているかどうかを確認します。小数点はUnicode桁ではなく、を返しますfalse
。
Null
を返しfalse
ます。空の場合は。String ("")
を返しtrue
ます。
これは論理的に正しいですか?なぜ彼らは空の文字列を数値として見るのですか?
ApacheのStringUtils.isNumeric()
メソッド仕様は次の
ように述べています。文字列にUnicodeの数字のみが含まれているかどうかを確認します。小数点はUnicode桁ではなく、を返しますfalse
。
Null
を返しfalse
ます。空の場合は。String ("")
を返しtrue
ます。
これは論理的に正しいですか?なぜ彼らは空の文字列を数値として見るのですか?
3.0では動作が変更されました。CommonsLang3.0の新機能から :
StringUtils.isAlpha、isNumeric、およびisAlphanumericは、空の文字列が渡されたときにすべてfalseを返すようになりました。以前はtrueを返していました。
参考のため、および3.0より前のユーザーのために、以下の古い回答を保持します。
これは論理的に正しいですか?
我々は持っています
この場合、1と2は互いに一致します。空の文字列のすべての文字はUnicode数字です。(または、同等に、空の文字列内のどの文字もUnicode数字ではありません。)これは、論理学者が空虚な真であり、やや直感に反していると呼んでいます。私のアパートの象はすべて緑だと言っているようなものです。私のアパートには象がいないので、それは本当です。
ただし、項目3(メソッドの名前)は、指定された文字列が数値を表す場合にtrueを返すメソッドとして自然に解釈されます。
つまり、それはドキュメントと実装のバグであるか、名前のバグです。それに対する正しい答えも間違った答えもありません。
ここにバグが報告されました。メンテナは、それが意図された振る舞いであるという立場を取ります。
なぜ彼らは空の文字列を数値として見るのですか?
メソッドの名前から、メソッドは数値を表す文字列に対してのみtrueを返す必要があると思われるかもしれませんが、仕様では、文字列にUnicodeの数字のみが含まれている場合はtrueを返す必要があると実際に示されています。
あなたは言う、
仕様に「文字列にUnicodeの数字しか含まれていないかどうかをチェックする」と書かれているため、混乱しています。「」に数字が含まれているのがわかりません。
空の文字列には、Unicodeの数字以外は含まれていないことに注意してください。したがって、メソッドはtrueを返します。
この質問をしたのは私だけではありません:)人々はApacheのJiraでこの欠陥を開いていました: https ://issues.apache.org/jira/browse/LANG-428
下位互換性を維持するためだけに(メソッドの仕様に従うために)修正せずに閉じました。
しかし、誰もがメソッドの現在の動作が間違っていることに同意しました。
java.lang.Integer.parseInt("")
失敗します。
それは論理の問題ではありません。それも常識の問題ではありません-記号なしで表される数字はありませんでした。空の文字列が0を表す必要がある理由についての強い議論はありません。
メソッド名がcontainsOnlyNumeric()
、の場合、数学の教科書によれば、「」に対してtrueを返すのは自然なことです。ただし、メソッド名はisNumeric()
、「」の扱いは自然ではありません。null
また、 falseを返す必要がある明確な理由はありません。nullの例外をスローします。
しかし、それはそれが何であるかであり、それは十分に文書化されており、あなたはこれ以上何を求めることができますか?
まず、文字列がempty()であるかどうかの条件を確認します。
if(StringUtils.isNotEmpty(str) && StringUtils.isNumeric(str)) {
}
その後、あなたの問題は解決されます。
しかし、さらにもう1つの問題は、次のような負の値を渡すことです。
str = "-1";
StringUtils.isNumeric(str)
それは誤りになります。
この状態に注意する必要があります。
別の解決策があります。NumberUtils.isNumber これは、Long、Double、Integerのいずれかの数値であるかどうかをチェックします。
この助けを願っています
Commons Lang 3.5の時点で、NumberUtils.isCreatableがこれを行う方法です。詳細については、この回答を参照してください。