J'ai une chaîne composée d'une séquence de chiffres (par exemple, "1234"
). Comment renvoyer la String
en tant que int
sans utiliser les fonctions de bibliothèque de Java telles que Integer.parseInt
?
public class StringToInteger {
public static void main(String [] args){
int i = myStringToInteger("123");
System.out.println("String decoded to number " + i);
}
public int myStringToInteger(String str){
/* ... */
}
}
Et quel est le problème avec cela?
int i = Integer.parseInt(str);
MODIFIER :
Si vous vraiment devez effectuer la conversion à la main, essayez ceci:
public static int myStringToInteger(String str) {
int answer = 0, factor = 1;
for (int i = str.length()-1; i >= 0; i--) {
answer += (str.charAt(i) - '0') * factor;
factor *= 10;
}
return answer;
}
Ce qui précède fonctionnera bien pour les entiers positifs. Si le nombre est négatif, vous devrez d'abord vérifier un peu, mais je laisserai cela comme exercice pour le lecteur.
Si les bibliothèques standard ne sont pas autorisées, plusieurs solutions permettent de résoudre ce problème. Une façon de penser à cela est comme une fonction récursive:
Vous aurez besoin de logique pour les cas spéciaux 0 et les nombres négatifs, mais sinon, cela peut être fait assez simplement.
Puisque je soupçonne que cela peut être un devoir (et que je sais que dans certaines écoles, c’est le cas), je laisserai au lecteur la conversion à proprement parler. :-)
J'espère que cela t'aides!
Utilisez long au lieu de int dans ce cas. Vous devez vérifier les débordements.
public static int StringtoNumber(String s) throws Exception{
if (s == null || s.length() == 0)
return 0;
while(s.charAt(0) == ' '){
s = s.substring(1);
}
boolean isNegative = s.charAt(0) == '-';
if (s.charAt(0) == '-' || (s.charAt(0) == '+')){
s = s.substring(1);
}
long result = 0l;
for (int i = 0; i < s.length(); i++){
int value = s.charAt(i) - '0';
if (value >= 0 && value <= 9){
if (!isNegative && 10 * result + value > Integer.MAX_VALUE ){
throw new Exception();
}else if (isNegative && -1 * 10 * result - value < Integer.MIN_VALUE){
throw new Exception();
}
result = 10 * result + value;
}else if (s.charAt(i) != ' '){
return (int)result;
}
}
return isNegative ? -1 * (int)result : (int)result;
}
Autre approche de la réponse déjà affichée ici. Vous pouvez traverser la chaîne de l'avant et construire le nombre
public static void stringtoint(String s){
boolean isNegative=false;
int number =0;
if (s.charAt(0)=='-') {
isNegative=true;
}else{
number = number* 10 + s.charAt(0)-'0';
}
for (int i = 1; i < s.length(); i++) {
number = number*10 + s.charAt(i)-'0';
}
if(isNegative){
number = 0-number;
}
System.out.println(number);
}
Vous pouvez procéder comme suit: à partir de la chaîne, créez un tableau de caractères pour chaque élément, conservez l'index sauvegardé et multipliez sa valeur ASCII par la puissance de l'index inverse réel. Faites la somme des facteurs partiels et vous l'obtenez.
Math.pow
(car il retourne un double) est une petite distribution, mais vous pouvez l'éviter en créant votre propre fonction d'alimentation.
public static int StringToInt(String str){
int res = 0;
char [] chars = str.toCharArray();
System.out.println(str.length());
for (int i = str.length()-1, j=0; i>=0; i--, j++){
int temp = chars[j]-48;
int power = (int) Math.pow(10, i);
res += temp*power;
System.out.println(res);
}
return res;
}
Compte tenu du bon indice, je pense que la plupart des diplômés du secondaire peuvent résoudre le leur. Tout le monde sait 134 = 100x1 + 10x3 + 1x4
La partie principale qui manque à la plupart des gens est que si vous faites quelque chose comme ça en Java
System.out.println('0'*1);//48
il choisira la représentation décimale de caractère 0 dans ascii chart et le multipliera par 1.
Dans tableau ascii le caractère 0 a une représentation décimale de 48. La ligne ci-dessus imprimera donc 48. Si vous faites quelque chose comme '1' - '0', cela revient à 49-48. Comme dans le diagramme ascii, les caractères 0 à 9 sont continus, vous pouvez donc utiliser n'importe quel caractère de 0 à 9 et soustraire 0 pour obtenir sa valeur entière. Une fois que vous avez la valeur entière pour un caractère, la conversion de la chaîne entière en int est simple.
Voici une autre solution au problème
String a = "-12512";
char[] chars = a.toCharArray();
boolean isNegative = (chars[0] == '-');
if (isNegative) {
chars[0] = '0';
}
int multiplier = 1;
int total = 0;
for (int i = chars.length - 1; i >= 0; i--) {
total = total + ((chars[i] - '0') * multiplier);
multiplier = multiplier * 10;
}
if (isNegative) {
total = total * -1;
}
En utilisant Java 8, vous pouvez effectuer les opérations suivantes:
public static int convert(String strNum)
{
int result =strNum.chars().reduce(0, (a, b)->10*a +b-'0');
}
Works for Positive and Negative String Using TDD
//Solution
public int convert(String string) {
int number = 0;
boolean isNegative = false;
int i = 0;
if (string.charAt(0) == '-') {
isNegative = true;
i++;
}
for (int j = i; j < string.length(); j++) {
int value = string.charAt(j) - '0';
number *= 10;
number += value;
}
if (isNegative) {
number = -number;
}
return number;
}
// Testcases
public class StringtoIntTest {
private StringtoInt stringtoInt;
@Before
public void setUp() throws Exception {
stringtoInt = new StringtoInt();
}
@Test
public void testStringtoInt() {
int excepted = stringtoInt.convert("123456");
assertEquals(123456,excepted);
}
@Test
public void testStringtoIntWithNegative() {
int excepted = stringtoInt.convert("-123456");
assertEquals(-123456,excepted);
}
}
public static int convertToInt(String input){
char[] ch=input.toCharArray();
int result=0;
for(char c : ch){
result=(result*10)+((int)c-(int)'0');
}
return result;
}
Utilisez ceci:
static int parseInt(String str) {
char[] ch = str.trim().toCharArray();
int len = ch.length;
int value = 0;
for (int i=0, j=(len-1); i<len; i++,j--) {
int c = ch[i];
if (c < 48 || c > 57) {
throw new NumberFormatException("Not a number: "+str);
}
int n = c - 48;
n *= Math.pow(10, j);
value += n;
}
return value;
}
Et au fait, vous pouvez gérer le cas particulier des entiers négatifs, sinon il lèvera une exception NumberFormatException .
Profitez du fait que Java utilise char et int de la même manière. Fondamentalement, faites char - '0' pour obtenir la valeur int du char.
public class StringToInteger {
public static void main(String[] args) {
int i = myStringToInteger("123");
System.out.println("String decoded to number " + i);
}
public static int myStringToInteger(String str) {
int sum = 0;
char[] array = str.toCharArray();
int j = 0;
for(int i = str.length() - 1 ; i >= 0 ; i--){
sum += Math.pow(10, j)*(array[i]-'0');
j++;
}
return sum;
}
}
Ceci est le programme complet avec toutes les conditions positives, négatives sans utiliser la bibliothèque
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("error!!!");
} 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;
}
}
Peut-être que cette voie sera un peu plus rapide:
public static int convertStringToInt(String num) {
int result = 0;
for (char c: num.toCharArray()) {
c -= 48;
if (c <= 9) {
result = (result << 3) + (result << 1) + c;
} else return -1;
}
return result;
}
public int myStringToInteger(String str) throws NumberFormatException
{
int decimalRadix = 10; //10 is the radix of the decimal system
if (str == null) {
throw new NumberFormatException("null");
}
int finalResult = 0;
boolean isNegative = false;
int index = 0, strLength = str.length();
if (strLength > 0) {
if (str.charAt(0) == '-') {
isNegative = true;
index++;
}
while (index < strLength) {
if((Character.digit(str.charAt(index), decimalRadix)) != -1){
finalResult *= decimalRadix;
finalResult += (str.charAt(index) - '0');
} else throw new NumberFormatException("for input string " + str);
index++;
}
} else {
throw new NumberFormatException("Empty numeric string");
}
if(isNegative){
if(index > 1)
return -finalResult;
else
throw new NumberFormatException("Only got -");
}
return finalResult;
}
Résultat: 1) Pour l’entrée "34567", le résultat final serait: 34567 2) Pour l’entrée "-4567", le résultat final serait: -4567 3 ) Pour l’entrée "-", le résultat final serait: Java.lang.NumberFormatException: seulement obtenu - 4) Pour l’entrée "12ab45", le résultat final serait: Java.lang.NumberFormatException: pour la chaîne de saisie 12ab45