どのように変換できますか String
にint
Javaで?
文字列には数値のみが含まれており、それが表す数値を返したいのですが。
たとえば、文字列を指定すると"1234"
、結果は数値になり1234
ます。
どのように変換できますか String
にint
Javaで?
文字列には数値のみが含まれており、それが表す数値を返したいのですが。
たとえば、文字列を指定すると"1234"
、結果は数値になり1234
ます。
回答:
String myString = "1234";
int foo = Integer.parseInt(myString);
Javaのドキュメントを見ると、「キャッチ」がこの関数がをスローする可能性があることに気付くでしょう。NumberFormatException
もちろん、これを処理する必要があります。
int foo;
try {
foo = Integer.parseInt(myString);
}
catch (NumberFormatException e)
{
foo = 0;
}
(この処理では、デフォルトで不正な形式の数値がに設定され0
ますが、必要に応じて他のことを実行できます。)
または、Ints
Java 8と組み合わせてOptional
、文字列をintに変換する強力で簡潔な方法となるGuavaライブラリのメソッドを使用することもできます。
import com.google.common.primitives.Ints;
int foo = Optional.ofNullable(myString)
.map(Ints::tryParse)
.orElse(0)
int foo = NumberUtils.toInt(myString, 0);
たとえば、次の2つの方法があります。
Integer x = Integer.valueOf(str);
// or
int y = Integer.parseInt(str);
これらの方法にはわずかな違いがあります。
valueOf
の新しいインスタンスまたはキャッシュされたインスタンスを返します java.lang.Integer
parseInt
プリミティブを返す int
。すべての場合に同じです:Short.valueOf
/ parseShort
、Long.valueOf
/ parseLong
など
valueOf
メソッドはただreturn valueOf(parseInt(string));
valueOf
再帰的に呼び出しますか?
valueOf(String)
は、最初にStringを使用してintに解析しparseInt(String)
、次にを使用してそのintをIntegerでラップすることによって実装されvalueOf(int)
ます。同じ名前であっても、valueOf(String)
およびvalueOf(int)
は2つの完全に異なる関数であるため、再帰はありません。
さて、考慮すべき非常に重要な点は、Javadocで述べられているように、整数パーサーがNumberFormatExceptionをスローすることです。
int foo;
String StringThatCouldBeANumberOrNot = "26263Hello"; //will throw exception
String StringThatCouldBeANumberOrNot2 = "26263"; //will not throw exception
try {
foo = Integer.parseInt(StringThatCouldBeANumberOrNot);
} catch (NumberFormatException e) {
//Will Throw exception!
//do something! anything to handle the exception.
}
try {
foo = Integer.parseInt(StringThatCouldBeANumberOrNot2);
} catch (NumberFormatException e) {
//No problem this time, but still it is good practice to care about exceptions.
//Never trust user input :)
//Do something! Anything to handle the exception.
}
分割された引数から整数値を取得したり、動的に解析したりする場合は、この例外を処理することが重要です。
"([0-9]+)"
意志「キャプチャ」9を通じて1以上の数字1の最初のシーケンス。Matcher
そのパッケージのクラスを見てください。
手動で行う:
public static int strToInt( String str ){
int i = 0;
int num = 0;
boolean isNeg = false;
//Check for negative sign; if it's there, set the isNeg flag
if (str.charAt(0) == '-') {
isNeg = true;
i = 1;
}
//Process each character of the string;
while( i < str.length()) {
num *= 10;
num += str.charAt(i++) - '0'; //Minus the ASCII code of '0' to get the value of the charAt(i++).
}
if (isNeg)
num = -num;
return num;
}
Integer.parseInt(s)
か?-私はこれがインタビューの質問であるという点を理解していますが、a)これはあなたがこの方法で行うことを意味するものではありません(これは質問者が尋ねたものです)、b)とにかくこの回答はかなり悪い例です。
Integer.parseInt
ため、より高速である必要があります。
代替ソリューションは、Apache Commonsの NumberUtils を使用することです。
int num = NumberUtils.toInt("1234");
文字列が無効な数値形式の場合は常に0が返されるため、Apacheユーティリティは便利です。したがって、try catchブロックを保存します。
現在、私は大学の課題を行っています。上記のような特定の式を使用することはできません。ASCIIテーブルを見ると、なんとかできました。これははるかに複雑なコードですが、私のように制限されている他の人を助けることができます。
最初にすることは、入力(この場合は数字の文字列)を受け取ることです。私はそれを呼びますString number
、そしてこの場合、私は数12を使ってそれを例示します、したがってString number = "12";
もう1つの制限は、繰り返しサイクルを使用できないことでした。そのため、for
サイクル(完璧だったはずです)も使用できません。これにより少し制限されますが、それが目標です。私は2桁(最後の2桁を取る)しか必要なかったので、簡単にcharAt
解決しました。
// Obtaining the integer values of the char 1 and 2 in ASCII
int semilastdigitASCII = number.charAt(number.length()-2);
int lastdigitASCII = number.charAt(number.length()-1);
コードがあれば、テーブルを調べて必要な調整を行うだけです。
double semilastdigit = semilastdigitASCII - 48; //A quick look, and -48 is the key
double lastdigit = lastdigitASCII - 48;
さて、なぜダブル?まあ、本当に「奇妙な」ステップのためです。現在、2つのdouble、1と2がありますが、12に変換する必要があります。実行できる数学演算はありません。
後者(最後の桁2/10 = 0.2
)を次のような方法で(したがって、なぜdoubleで)10で除算します。
lastdigit = lastdigit/10;
これは単に数字で遊んでいるだけです。最後の桁を10進数に変えていました。しかし今、何が起こるかを見てください:
double jointdigits = semilastdigit + lastdigit; // 1.0 + 0.2 = 1.2
数学をあまり理解しなくても、数値の数字の単位を分離するだけです。ご覧のとおり、0〜9のみを考慮しているため、10の倍数で除算することは、それを格納する「ボックス」を作成するようなものです(1年生の先生がユニットと100について説明したときを思い出してください)。そう:
int finalnumber = (int) (jointdigits*10); // Be sure to use parentheses "()"
そして、あなたは行きます。次の制限を考慮して、数字のストリング(この場合は2桁)をこれらの2桁で構成される整数に変換しました。
'0'
文字のための代わり48
に持っていると決して実際の数値に悩まされる。第3に、double
値での回り道全体は、10で除算しているのでまったく意味がありません。後で10を掛けるだけです。その結果、単純さsemilastdigit * 10 + lastdigit
として小数システムを導入した場合、小学校で学んだ...
semilastdigit
とのみを使用することにより、この問題を完全に回避していますlastdigit
。任意の長さの有効な数値文字列(「-2147483648」と「2147483647」の間の任意の値)を提供した場合、「反復サイクル」を回避するためにソリューションをどのようにコーディングしますか
Integer.decode
も使用できますpublic static Integer decode(String nm) throws NumberFormatException
。
ベース8と16でも機能します。
// base 10
Integer.parseInt("12"); // 12 - int
Integer.valueOf("12"); // 12 - Integer
Integer.decode("12"); // 12 - Integer
// base 8
// 10 (0,1,...,7,10,11,12)
Integer.parseInt("12", 8); // 10 - int
Integer.valueOf("12", 8); // 10 - Integer
Integer.decode("012"); // 10 - Integer
// base 16
// 18 (0,1,...,F,10,11,12)
Integer.parseInt("12",16); // 18 - int
Integer.valueOf("12",16); // 18 - Integer
Integer.decode("#12"); // 18 - Integer
Integer.decode("0x12"); // 18 - Integer
Integer.decode("0X12"); // 18 - Integer
// base 2
Integer.parseInt("11",2); // 3 - int
Integer.valueOf("11",2); // 3 - Integer
int
代わりに取得したい場合はInteger
、以下を使用できます。
開梱:
int val = Integer.decode("12");
intValue()
:
Integer.decode("12").intValue();
指定された文字列に整数が含まれていない可能性が少しでもある場合は常に、この特殊なケースを処理する必要があります。悲しいことに、標準のJavaメソッドInteger::parseInt
とInteger::valueOf
スローして、NumberFormatException
この特別なケースを通知します。したがって、フロー制御には例外を使用する必要がありますが、これは一般に悪いコーディングスタイルと見なされます。
私の意見では、この特別なケースは、空のを返すことで処理する必要がありますOptional<Integer>
。Javaはそのようなメソッドを提供していないため、次のラッパーを使用します。
private Optional<Integer> tryParseInteger(String string) {
try {
return Optional.of(Integer.valueOf(string));
} catch (NumberFormatException e) {
return Optional.empty();
}
}
使用例:
// prints "12"
System.out.println(tryParseInteger("12").map(i -> i.toString()).orElse("invalid"));
// prints "-1"
System.out.println(tryParseInteger("-1").map(i -> i.toString()).orElse("invalid"));
// prints "invalid"
System.out.println(tryParseInteger("ab").map(i -> i.toString()).orElse("invalid"));
これは内部でフロー制御の例外を使用していますが、使用法のコードは非常にクリーンになります。また、が-1
有効な値として解析された場合と無効な文字列を解析できなかった場合を明確に区別できます。
文字列をintに変換することは、単に数値を変換するよりも複雑です。次の問題について考えています。
それを行う方法:
1. Integer.parseInt(s)
2. Integer.parseInt(s, radix)
3. Integer.parseInt(s, beginIndex, endIndex, radix)
4. Integer.parseUnsignedInt(s)
5. Integer.parseUnsignedInt(s, radix)
6. Integer.parseUnsignedInt(s, beginIndex, endIndex, radix)
7. Integer.valueOf(s)
8. Integer.valueOf(s, radix)
9. Integer.decode(s)
10. NumberUtils.toInt(s)
11. NumberUtils.toInt(s, defaultValue)
Integer.valueOfは、Integerオブジェクト、その他すべてのメソッド-プリミティブintを生成します。
commons-lang3の最後の2つのメソッドと、ここでの変換に関する大きな記事。
のparseInt(String str)
方法を使用できますInteger
ラッパークラスの、文字列値を整数値に変換ます。
例えば:
String strValue = "12345";
Integer intValue = Integer.parseInt(strVal);
Integer
クラスも提供valueOf(String str)
する方法を:
String strValue = "12345";
Integer intValue = Integer.valueOf(strValue);
また、使用することができるtoInt(String strValue)
のNumberUtilsユーティリティクラスの変換のために:
String strValue = "12345";
Integer intValue = NumberUtils.toInt(strValue);
を使用しInteger.parseInt(yourString)
ます。
次の点に注意してください。
Integer.parseInt("1");
// OK
Integer.parseInt("-1");
// OK
Integer.parseInt("+1");
// OK
Integer.parseInt(" 1");
//例外(空白)
Integer.parseInt("2147483648");
//例外(整数は最大値 2,147,483,647に制限されます)
Integer.parseInt("1.1");
//例外(。または、または許可されていないもの)
Integer.parseInt("");
//例外(0などではない)
例外は1種類のみです。 NumberFormatException
私には解決策がありますが、それがどれほど効果的かわかりません。しかし、それはうまく機能し、あなたはそれを改善できると思います。一方、私はJUnitを使用していくつかのテストを行いました。私は関数とテストを添付しました:
static public Integer str2Int(String str) {
Integer result = null;
if (null == str || 0 == str.length()) {
return null;
}
try {
result = Integer.parseInt(str);
}
catch (NumberFormatException e) {
String negativeMode = "";
if(str.indexOf('-') != -1)
negativeMode = "-";
str = str.replaceAll("-", "" );
if (str.indexOf('.') != -1) {
str = str.substring(0, str.indexOf('.'));
if (str.length() == 0) {
return (Integer)0;
}
}
String strNum = str.replaceAll("[^\\d]", "" );
if (0 == strNum.length()) {
return null;
}
result = Integer.parseInt(negativeMode + strNum);
}
return result;
}
JUnitを使用したテスト:
@Test
public void testStr2Int() {
assertEquals("is numeric", (Integer)(-5), Helper.str2Int("-5"));
assertEquals("is numeric", (Integer)50, Helper.str2Int("50.00"));
assertEquals("is numeric", (Integer)20, Helper.str2Int("$ 20.90"));
assertEquals("is numeric", (Integer)5, Helper.str2Int(" 5.321"));
assertEquals("is numeric", (Integer)1000, Helper.str2Int("1,000.50"));
assertEquals("is numeric", (Integer)0, Helper.str2Int("0.50"));
assertEquals("is numeric", (Integer)0, Helper.str2Int(".50"));
assertEquals("is numeric", (Integer)0, Helper.str2Int("-.10"));
assertEquals("is numeric", (Integer)Integer.MAX_VALUE, Helper.str2Int(""+Integer.MAX_VALUE));
assertEquals("is numeric", (Integer)Integer.MIN_VALUE, Helper.str2Int(""+Integer.MIN_VALUE));
assertEquals("Not
is numeric", null, Helper.str2Int("czv.,xcvsa"));
/**
* Dynamic test
*/
for(Integer num = 0; num < 1000; num++) {
for(int spaces = 1; spaces < 6; spaces++) {
String numStr = String.format("%0"+spaces+"d", num);
Integer numNeg = num * -1;
assertEquals(numStr + ": is numeric", num, Helper.str2Int(numStr));
assertEquals(numNeg + ": is numeric", numNeg, Helper.str2Int("- " + numStr));
}
}
}
(int) Double.parseDouble(input.replaceAll("[^0-9\\.\\-]", ""));
Google GuavaにはtryParse(String)があります。これはnull
、文字列を解析できなかった場合に返されます。次に例を示します。
Integer fooInt = Ints.tryParse(fooString);
if (fooInt != null) {
...
}
数値以外の文字をすべて削除してから、整数を解析することから始めることもできます。
String mystr = mystr.replaceAll("[^\\d]", "");
int number = Integer.parseInt(mystr);
ただし、これは負でない数に対してのみ機能することに注意してください。
"4+2"
、私が42
やろうとしたことは間違っていたということについて何のヒントもなく結果として得られます。ユーザーはのような基本的な式を4+2
入力することは有効な入力であるかのように見えますが、アプリケーションは間違った値で続行します。それ以外は、タイプは… String
ではなく、string
以前の回答とは別に、いくつかの機能を追加したいと思います。これらは、使用中の結果です。
public static void main(String[] args) {
System.out.println(parseIntOrDefault("123", 0)); // 123
System.out.println(parseIntOrDefault("aaa", 0)); // 0
System.out.println(parseIntOrDefault("aaa456", 3, 0)); // 456
System.out.println(parseIntOrDefault("aaa789bbb", 3, 6, 0)); // 789
}
実装:
public static int parseIntOrDefault(String value, int defaultValue) {
int result = defaultValue;
try {
result = Integer.parseInt(value);
}
catch (Exception e) {
}
return result;
}
public static int parseIntOrDefault(String value, int beginIndex, int defaultValue) {
int result = defaultValue;
try {
String stringValue = value.substring(beginIndex);
result = Integer.parseInt(stringValue);
}
catch (Exception e) {
}
return result;
}
public static int parseIntOrDefault(String value, int beginIndex, int endIndex, int defaultValue) {
int result = defaultValue;
try {
String stringValue = value.substring(beginIndex, endIndex);
result = Integer.parseInt(stringValue);
}
catch (Exception e) {
}
return result;
}
述べたように、Apache Commons NumberUtils
はそれを行うことができます。戻る0
文字列をintに変換できない場合。
独自のデフォルト値を定義することもできます。
NumberUtils.toInt(String str, int defaultValue)
例:
NumberUtils.toInt("3244", 1) = 3244
NumberUtils.toInt("", 1) = 1
NumberUtils.toInt(null, 5) = 5
NumberUtils.toInt("Hi", 6) = 6
NumberUtils.toInt(" 32 ", 1) = 1 // Space in numbers are not allowed
NumberUtils.toInt(StringUtils.trimToEmpty(" 32 ", 1)) = 32;
このコードは、いくつかの注意事項とともに使用することもできます。
オプション#1:メッセージダイアログを表示するなど、例外を明示的に処理してから、現在のワークフローの実行を停止します。例えば:
try
{
String stringValue = "1234";
// From String to Integer
int integerValue = Integer.valueOf(stringValue);
// Or
int integerValue = Integer.ParseInt(stringValue);
// Now from integer to back into string
stringValue = String.valueOf(integerValue);
}
catch (NumberFormatException ex) {
//JOptionPane.showMessageDialog(frame, "Invalid input string!");
System.out.println("Invalid input string!");
return;
}
オプション#2:例外の発生時に実行フローを続行できる場合は、影響を受ける変数をリセットします。たとえば、catchブロックにいくつかの変更を加えた
catch (NumberFormatException ex) {
integerValue = 0;
}
定数は決してnull値を返さないため、比較やその他の計算に文字列定数を使用することは常に良い考えです。
JOptionPane.showMessageDialog()
バニラJavaの質問に対する答えを入れても意味がありません。
Integer.valueOf(String);
タイプを返しませんint
。
使用できますnew Scanner("1244").nextInt()
。またはintさえ存在するかどうか尋ねます:new Scanner("1244").hasNextInt()
数値が常に有効な整数であることが保証されているプログラミング競技では、入力を解析する独自のメソッドを作成できます。これは、検証に関連するすべてのコードをスキップし(そのいずれも必要ないため)、もう少し効率的になります。
有効な正の整数の場合:
private static int parseInt(String str) {
int i, n = 0;
for (i = 0; i < str.length(); i++) {
n *= 10;
n += str.charAt(i) - 48;
}
return n;
}
正と負の両方の整数の場合:
private static int parseInt(String str) {
int i=0, n=0, sign=1;
if (str.charAt(0) == '-') {
i = 1;
sign = -1;
}
for(; i<str.length(); i++) {
n* = 10;
n += str.charAt(i) - 48;
}
return sign*n;
}
これらの数値の前後に空白があると予想される場合は、str = str.trim()
さらに処理する前に必ずaを実行してください。
単にあなたはこれを試すことができます:
Integer.parseInt(your_string);
に変換するString
ために使用しますint
Double.parseDouble(your_string);
に変換するString
ために使用しますdouble
String str = "8955";
int q = Integer.parseInt(str);
System.out.println("Output>>> " + q); // Output: 8955
String str = "89.55";
double q = Double.parseDouble(str);
System.out.println("Output>>> " + q); // Output: 89.55
int foo=Integer.parseInt("1234");
文字列に数値以外のデータがないことを確認してください。
Stringをパラメーターとして取るIntegerコンストラクターについて誰も言及しなかったことに少し驚いています。
だから、ここにあります:
String myString = "1234";
int i1 = new Integer(myString);
もちろん、コンストラクタはtypeを返しInteger
、ボックス化解除操作は値をに変換しますint
。
言及することが重要です:このコンストラクタはparseInt
メソッドを呼び出します。
public Integer(String var1) throws NumberFormatException {
this.value = parseInt(var1, 10);
}
Integer.parseInt()を使用してtry...catch
ブロック内に配置し、数値以外の文字が入力された場合に備えてエラーを処理します。次に例を示します。
private void ConvertToInt(){
String string = txtString.getText();
try{
int integerValue=Integer.parseInt(string);
System.out.println(integerValue);
}
catch(Exception e){
JOptionPane.showMessageDialog(
"Error converting string to integer\n" + e.toString,
"Error",
JOptionPane.ERROR_MESSAGE);
}
}
次の7つの方法で実行できます。
import com.google.common.primitives.Ints;
import org.apache.commons.lang.math.NumberUtils;
String number = "999";
1)使用Ints.tryParse
:
int result = Ints.tryParse(number);
2)使用NumberUtils.createInteger
:
Integer result = NumberUtils.createInteger(number);
3)使用NumberUtils.toInt
:
int result = NumberUtils.toInt(number);
4)使用Integer.valueOf
:
Integer result = Integer.valueOf(number);
5)使用Integer.parseInt
:
int result = Integer.parseInt(number);
6)使用Integer.decode
:
int result = Integer.decode(number);
7)使用Integer.parseUnsignedInt
:
int result = Integer.parseUnsignedInt(number);
1つのメソッドはparseInt(String)です。プリミティブintを返します。
String number = "10";
int result = Integer.parseInt(number);
System.out.println(result);
2番目のメソッドはvalueOf(String)で、新しいInteger()オブジェクトを返します。
String number = "10";
Integer result = Integer.valueOf(number);
System.out.println(result);
次のいずれかを使用できます。
Integer.parseInt(s)
Integer.parseInt(s, radix)
Integer.parseInt(s, beginIndex, endIndex, radix)
Integer.parseUnsignedInt(s)
Integer.parseUnsignedInt(s, radix)
Integer.parseUnsignedInt(s, beginIndex, endIndex, radix)
Integer.valueOf(s)
Integer.valueOf(s, radix)
Integer.decode(s)
NumberUtils.toInt(s)
NumberUtils.toInt(s, defaultValue)
これは、ライブラリを使用せずにすべての条件が正と負の完全なプログラムです
import java.util.Scanner;
public class StringToInt {
public static void main(String args[]) {
String inputString;
Scanner s = new Scanner(System.in);
inputString = s.nextLine();
if (!inputString.matches("([+-]?([0-9]*[.])?[0-9]+)")) {
System.out.println("Not a Number");
}
else {
Double result2 = getNumber(inputString);
System.out.println("result = " + result2);
}
}
public static Double getNumber(String number) {
Double result = 0.0;
Double beforeDecimal = 0.0;
Double afterDecimal = 0.0;
Double afterDecimalCount = 0.0;
int signBit = 1;
boolean flag = false;
int count = number.length();
if (number.charAt(0) == '-') {
signBit = -1;
flag = true;
}
else if (number.charAt(0) == '+') {
flag = true;
}
for (int i = 0; i < count; i++) {
if (flag && i == 0) {
continue;
}
if (afterDecimalCount == 0.0) {
if (number.charAt(i) - '.' == 0) {
afterDecimalCount++;
}
else {
beforeDecimal = beforeDecimal * 10 + (number.charAt(i) - '0');
}
}
else {
afterDecimal = afterDecimal * 10 + number.charAt(i) - ('0');
afterDecimalCount = afterDecimalCount * 10;
}
}
if (afterDecimalCount != 0.0) {
afterDecimal = afterDecimal / afterDecimalCount;
result = beforeDecimal + afterDecimal;
}
else {
result = beforeDecimal;
}
return result * signBit;
}
}
Integer.parseInt
。使用するだけです。