方法實現:字符串轉double型數

小聲BB幾句:好久沒有動手寫博客了,因爲覺得自己一直在給搜索引擎製造垃圾(相似的內容,前輩們都寫過啦)。後來還是想通了,當成是自己的線上筆記吧。

問題:

實現一個方法,輸入爲一個字符串,輸出爲字符串轉成的double類型的數字。如果字符串中存在非法字符,拋出異常。

分析:

這個問題是餓了麼的面試官問我的,主要是想考查如何思考對於輸入的字符串合法。對於這個問題,面試官引導我先寫幾個測試用例,找出合法字符串的特徵,我們可以考慮以下用例:
“123.670”——合法
“-123.689”——合法
“da12.3”——不合法
“12”——合法
“12.3.9”——不合法
“00.123”——不合法
我們可以從四個方面考慮:

  1. 能出現的字符:負號(-),數字(0-9),小數點(.)
  2. 出現的次數:負號(-),小數點(.)一次,大小是否越界(越界這個我不會,(⊙o⊙)…)
  3. 出現的位置:負號(-)必須在最前,而(.)必須在中間(最前或者最後都不行)
  4. 出現的組合:001,002這種(這點我理解爲,0出現的位置,如果第一個字符是0,而他後面沒有緊接着出現小數點那麼這就是一個不合法的字符串)
public static double stringToDouble(String str) throws Exception{
		boolean negative = false;
		double sum = 0.0d;
		boolean pointAppear = false;
		int count = 1;//用來記錄小數點後幾位
		
		if(str == null || str.equals("")){
			throw new Exception("重新輸入字符串");
		}
		
		for(int i=0;i<str.length();i++){
			//判斷第一個字符是不是負號
			if(i == 0 && (str.charAt(0)=='-'||str.charAt(0)=='+')){
				if(str.charAt(i) == '-')
					negative = true;
			}else{
				//判斷是否爲小數點
				if(pointAppear == false && i !=0 && str.charAt(i) == '.'){
					pointAppear = true;
				}else if(str.charAt(i)>='0' && str.charAt(i)<='9'){
					
					if(i==0 && str.charAt(i) == '0' ){
						if(str.charAt(i+1) != '.')
							throw new Exception("不合法字符串1");
					}
					
					if(i==1 && str.charAt(i) == '0' && (str.charAt(0)=='-'||str.charAt(0)=='+')){
						if(str.charAt(i+1) != '.')
							throw new Exception("不合法字符串2");
					}
					
					//整數部分
					if(pointAppear == false){
						sum = sum*10 +(str.charAt(i)-'0');
						if(sum > Double.MAX_VALUE) {
							throw new Exception("越界");
						}
					}else{
						sum = sum + Math.pow(0.1,count)*(str.charAt(i)-'0');
						count++;
					}
				}else{
					throw new Exception("不合法字符串3");
				}
			}
		}
		return negative == true ? sum*(-1):sum;
		
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章