java 实现atof函数

atof函数

将字符串转换为浮点数,此函数规则如下:
它会扫描参数 s 字符串,跳过前面的空白字符(例如空格,tab缩进等),直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时(‘\0’)才结束转换,并将结果返回。参数 s 字符串可包含正负号、小数点或E(e)来表示指数部分,如123. 456 或123e-2。
【返回值】返回转换后的浮点数;如果字符串 s 不能被转换为 float,那么返回 0.0。

public class algorithm {
    public float atof(String s){
        float left = 0.0f;
        float right = 0.0f;
        boolean positive = true;
        boolean ePo = true;
        int start = 0;
        int size = s.length();
        //跳过空格等
        while(start < size && (s.charAt(start) == ' ' || s.charAt(start) == '\t')){
            start++;
        }
        //判断是否有正负符号
        if(start < size && s.charAt(start) == '-'){
            positive = false;
            start++;
        }
        else if(start < size && s.charAt(start) == '+'){
            start++;
        }
        //计算小数点左侧
        while(start < size && s.charAt(start) >= '0' && s.charAt(start) <= '9'){
            left = left*10 + s.charAt(start) - '0';
            start++;
        }
        //计算小数点右侧
        float order = 1.0f;
        if(start < size && s.charAt(start) == '.'){
            start++;
            while(start < size && s.charAt(start) >= '0' && s.charAt(start) <= '9'){
                order = order/10;
                right = right + (s.charAt(start) - '0')*order;
                start++;
            }
        }
        //判断是否有科学计数 e
        int or = 0;
        if(start < size && s.charAt(start) == 'e'){
            start++;
            //判断科学计数前的正负
            if(start < size && s.charAt(start) == '-'){
                ePo = false;
                start++;
            }
            else if(start < size && s.charAt(start) == '+'){
                start++;
            }
            while(start < size && s.charAt(start) >= '0' && s.charAt(start) <= '9'){
                or = or*10 + s.charAt(start) - '0';
                start++;
            }
        }
        //计算科学计数移动的小数点位数
        order = 1.0f;
        while(or > 0 && ePo){
            order = order*10;
            or--;
        }
        while(or > 0 && !ePo){
            order = order/10;
            or--;
        }
        //得到结果
        float result = (left + right) * order;
        if(!positive){
            return -result;
        }
        return result;
    }

}

测试单元:
String[] examples = {"234.34", "-3.34", "++23/43ji", "j3i43.2", "23.3e-3", ".23f", "", " 234.32ji"};
输出结果:

234.34
-3.34
0.0
0.0
0.023299998
0.23
0.0
234.32

可以看到,由于是单精度浮点数,23.3e-3的返回值为0.023299998,当大于7位会四舍五入.

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值