JZ53 表示数值的字符串

原题链接


描述

请实现一个函数用来判断字符串str是否表示数值(包括科学计数法的数字,小数和整数)。


示例

输入:"123.45e+6"
返回值:true

思路

从头依次遍历,针对各种情况设置符号标志,乍一看比较简单的但是细节很多,一不小心就会遗漏一些。有些会被认为不是数值的输入也会返回 true,主要有"1." ".1"


解答

package com.klaus.math.prob53;

public class Solution {

    public boolean isNumeric(String str) {

        int context = 0;// 是否有意义的内容
        int token = 0;
        int before = 0;//点前面的位数
        int point = 0;
        int after = 0;// 点后面的位数
        int e = 0;

        for (int i = 0; i < str.length(); ++i) {
            // 空格
            if (str.charAt(i) == ' ') {
                --context;
            }
            // 正负号
            else if (str.charAt(i) == '+' || str.charAt(i) == '-') {
                // 幂符号
                if (i == 0) {
                    ++token;
                }
                // 指数符号
                else if (str.charAt(i - 1) == 'e' || str.charAt(i - 1) == 'E') {
                    ++token;
                } else
                    return false;
                if (token > 1) return false;
            }
            // e
            else if (str.charAt(i) == 'e' || str.charAt(i) == 'E') {
                if (before == 0)
                    return false;
                ++e;
                if (e > 1)
                    return false;
                token = 0;
                point = 1;
            }
            // 小数点
            else if (str.charAt(i) == '.') {
                point++;
                after = 0;
                if (point > 1)
                    return false;
            }
            // 数字
            else if (str.charAt(i) >= '0' && str.charAt(i) <= '9') {
                if (point == 0) {
                    before++;
                    after++;
                } else
                    after++;
            } else {
                return false;
            }
            ++context;
        }

        // 如果没有点
        if (e == 1 && after == 0)
            return false;

        if (token == 1 && after == 0)
            return false;

        if (context <= 0)
            return false;

        if (point == 1 && after == 0 && before == 0)
            return false;

        return true;
    }
}
上一篇:KMP算法


下一篇:IOS中数据存储 sqlite3 的应用, 知识点: 数据库句柄 , 单例模式运用, Services服务层,sqlite3_open, sqlite3_exec, sqlite3_prepare_v2,sqlite3_step等等