2011-06-20 10 views
1

これは私にとって非常に奇妙で、完全に私は普通のJavaを使いたいと思う人々の側に私を入れているようです。グルーヴィーなベースのアプリを書いている間、私はそのようなことに遭遇しました:groovy数学で何が問題になっていますか?

int filesDaily1 = (item.filesDaily ==~ /^[0-9]+$/) ? 
      Integer.parseInt(item.filesDaily) : item.filesDaily.substring(0, item.filesDaily.indexOf('.')) 

     def filesDaily = (item.filesDaily ==~ /^[0-9]+$/) ? 
      Integer.parseInt(item.filesDaily) : item.filesDaily.substring(0, item.filesDaily.indexOf('.')) 

ので、item.filesDailyが値を持つ文字列であることを知っている「1 .. *」どのようにそれはおそらくfilesDaily1は49とfilesDailyに等しいこと、することができ1に等しいか?それ以上は何

int numOfExpectedEntries = filesDaily * item.daysToCheck 

ような何かをしようとしたときに例外が

Cannot cast object '111' with class 'java.lang.String' to class 'int' 

は乗算とコードの正確なラインを指していることを言って投げられるということです。それはどうしたらできますか?

答えて

5

あなたはintにこの値を代入している:

item.filesDaily.substring(0, item.filesDaily.indexOf('.')) 

私ははGroovyのが「1」の文字に「1」単一文字の文字列を変換して、Unicodeを取っているを推測しています通常のcharからintへの変換では...値は49になります。

文字列を10進数として解析する場合は、組み込み変換ではなくInteger.parseIntを使用してください。

ここでfilesDaily1filesDailyの違いは、filesDaily1がintを意味することをGroovyに伝えていることです。そのため、intへの変換が適用されています。あなたのテストケースではfilesDailyが実際には文字列 "1"であると思われます。

I 容疑者あなたは本当にただのようなものにコードを変更する:これは、グルーヴィーな型変換コードのバグである

String text = (item.filesDaily ==~ /^[0-9]+$/) ? items.filesDaily : 
        item.filesDaily.substring(0, item.filesDaily.indexOf('.')) 
Integer filesDaily = text.toInteger() 
+1

+1 Groovy 2.0で混乱を招くように見えることは明らかです...単一の文字列は 'char'を介して' int'に変換されます...複数の文字列が例外を投げる –

+0

うん。 ..ポストから数秒後に気づいた。例外メッセージはまだ曖昧です。 –

+1

@den、三項式を 'int filesDaily1 = Integer.parseInt(item.filesDaily =〜/^([0-9]+).*$/)[0] [1])'に変更することができます*もっとシンプルかもしれない...またはそうではありません;-) –

4

int a = '1' 
int b = '11' 

異なるコンバータが使用されるため、異なる結果が返されます。例ではaは49、bは11になります。なぜですか?

1文字からintへの変換(String.charAt(0)を使用)は、整数パーサよりも優先順位が高くなります。

悪いことに、これはすべての単一文字列で発生します。あなたも、あなたが自動型変換に頼るInteger.parseInt()の代わりを使用しなければならない、限り、あなたが文字列のどのくらい知る方法はありませんよう、あなたに65

を与えるint a = 'A'を行うことができます。

+1

私はそれがバグだとは思わない、それは驚くべき機能だ;-) –