java - Convert String representation to minimal Number Object -


having string representation of number(no decimals), what's best way convert either 1 of java.lang.integer or java.lang.long or java.math.biginteger? condition converted type should of minimal datatype required hold number.

i've current implementation works fine, know if there's better code without exception handling.

package com.stackoverflow.programmer;  import java.math.biginteger;  public class test {     public static void main(string[] args) {          string number = "-12121111111111111";         number numberobject = null;         try {             numberobject = integer.valueof(number);         } catch (numberformatexception nfe) {             system.out.println("number not fit integer type. trying long...");             try {                 numberobject = long.valueof(number);             } catch (numberformatexception nfeb) {                 system.out.println("number not fit long type. trying biginteger...");                 numberobject = new biginteger(number);             }         }         system.out.println(numberobject.getclass() + " : "                 + numberobject.tostring());     } } 

from said, here have done:

import java.math.biginteger; import java.util.arrays; import java.util.list;  public class testso09_39463168_stringtominimalnumber {      public static void main(string[] args) {         list<string> strnumbers = arrays.aslist("0", //int                 "123", //int                 "-456", //int                 "2147483700", // long                 "-2147483700", // long                 "9223372036854775900", //bigint                 "-9223372036854775900" //bigint                 );          for(string strnumber : strnumbers){             number number = stringtominimalnumber(strnumber);             system.out.println("the string '"+strnumber+"' "+number.getclass());         }      }      public static number stringtominimalnumber(string s){         biginteger tempnumber = new biginteger(s);          if(tempnumber.compareto(biginteger.valueof(long.max_value)) > 0 || tempnumber.compareto(biginteger.valueof(long.min_value)) < 0){             return tempnumber;         } else if(tempnumber.compareto(biginteger.valueof(integer.max_value)) > 0 || tempnumber.compareto(biginteger.valueof(integer.min_value)) < 0){             return tempnumber.longvalue(); //autobox long         } else {             return tempnumber.intvalue(); //autobox integer         }      }  } 

you must use temporary biginteger, or else you'll end lazarov's solution, correct, can't reason mentionned in comments.

anyway, every biginteger (the ones not returned) garbage collected. autoboxing, don't think it's of bad thing. make "biginteger.valueof(long.max_value))" constant. maybe compiler or jvm on own.

i'm not sure of how efficient is, , using biginteger might idea (as spotted did), because serioulsy doubt improve rest of code use right size, , might error prone if try use these numbers each other ... again, depend on need. (and yes, using exception flow control bad idea, can add try catch on biginteger tempnumber = new biginteger(s); throw own exception if s not number @ all)

for recreational purpose, have made solution without using biginteger, , string parsing (this still not recommand do, fun :)

public static final string int_max_value = "2147483647"; public static final string long_max_value = "9223372036854775807";  public static number stringtominimalnumberwithoutbiginteger(string numberstr){     //removing minus sign test value     string s = (numberstr.startswith("-") ? numberstr.substring(1,numberstr.length()) : numberstr);      if(comparestringnumber(s, long_max_value) > 0){         return new biginteger(numberstr);     } else if(comparestringnumber(s, int_max_value) > 0){         return new long(numberstr);     } else {         return new integer(numberstr);     } }  //return postive if > b, negative if < b, 0 if equals; private static int comparestringnumber(string a, string b){     if(a.length() != b.length()){         return a.length() - b.length();     }     for(int = 0; < a.length(); i++){         if( a.codepointat(i) != b.codepointat(i) ){ //or charat()             return a.codepointat(i) - b.codepointat(i);         }     }     return 0; } 

Comments

Popular posts from this blog

javascript - Thinglink image not visible until browser resize -

firebird - Error "invalid transaction handle (expecting explicit transaction start)" executing script from Delphi -

mongodb - How to keep track of users making Stripe Payments -