欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java,字符串转数字long,严格模式与不严格模式,

程序员文章站 2022-03-02 19:01:31
...

在使用编程语言时,我们会有一定的将字符串转为数字的需求。恰好在java中具备包装类,既然是java 我们就简单的对long类进行封装,并创建一个字符串转数字的函数。
首先,这是一个包装类,类名有点随意!
类的属性为d1,b
其中包装的属性是d1
具备若干个构造函数,分别是
默认构造:
封装d1初始化为0
long值构造
字符串默认非严格构造
字符串可选构造。
b是用来存储是否严格构造的属性。
如果是严格模式,toLong()方法的作用是:{类似于javascript的parseInt,但并不完全一样)
如果字符串包含不是数字的字符串就会返回默认值0。
如果不是严格模式{类似于javscript的Number()但并不完全一样}
从字符串的前面开始,如果存在数字就转为数字,直到遇到非数字字符。
isNumber()用来判断一个字符或是 (char)byte是否是一个数字字符。方法重载,重载形式参考于(得到灵感于)java源码重载形式。//尽管严格来说本类不需要对其进行重载。
pow()是一个简单的幂函数()。
getBytes()是内置函数将字符串转化为byte数组。
后注:据此可以很简单的将字符串转化为int等,但是int,byte等的表示范围较小,作用不大。

class Data{
    private long d1;
    private boolean b;
    public Data(){
        d1 = 0L;
    }
    public Data(long _d){
        d1 = _d;
    }
    public Data(String s, boolean _b){
        d1 = toLong(s,_b);
        b = _b;
    }
    public Data(String s){
        d1 = toLong(s,true);
    }

    public boolean isNumber(char c){
        return isNumber((byte)c);
    }

    public boolean isNumber(byte i){
        if(i>=48 && i<=57){
            return true;
        }else{
            return false;
        }
    }

    public long pow(int a,int b){
        long output = 1L;
        for(int k = 0; k < b;k++){
            output *= a;
        }
        return output;
    }

    private long toLong(String s,boolean strict) {
        long output = 0L;
        byte b[] = s.getBytes();
        for(int i = 0; i < b.length;i++){
            if(!isNumber(b[i])&&strict){
                return 0L;
            }else if(isNumber(b[i])){
                output += ((int)b[i] - 48) * pow(10,(b.length - i - 1));
            }else{
                return output / pow(10, b.length - i);
            }
        }
        return output;//避免b为空字符,以及显式的标示有返回值。
    }
    public long getValue(){
        return d1;
    }
    public void setValue(long _d1){
        d1 = _d1;
    }
}
public class Q8 {
    public static void main(String[] args){
        //Object v = new Data("728qad", true);
        //System.out.println(((Data) v).getValue());
        Data f = new Data("2334ne",false);
        System.out.println(f.getValue());
        Data g = new Data("2334ne",true);
        System.out.println(g.getValue());

    }
}

输出:

//0
2334
0

修正版,尽管之前版本已经较为完备,但是会出现如果字符串以0开始会出现的一些错误。
本以为之前版本会有点问题,测试后发现原本的比我想得要健壮,可以处理字符串以0
开始的情况,但是稍微有点难以理解,下面是显式的排除0的版本。

import org.jetbrains.annotations.NotNull;

class Data{
    private long d1;
    private boolean b;
    public Data(){
        d1 = 0L;
    }
    public Data(long _d){
        d1 = _d;
    }
    public Data(String s, boolean _b){
        d1 = toLong(s,_b);
        b = _b;
    }
    public Data(String s){
        d1 = toLong(s,true);
    }

    public boolean isNumber(char c){
        return isNumber((byte)c);
    }

    public boolean isNumber(byte i){
        if(i>=48 && i<=57){
            return true;
        }else{
            return false;
        }
    }

    public long pow(int a,int b){
        long output = 1L;
        for(int k = 0; k < b;k++){
            output *= a;
        }
        return output;
    }

    private long toLong(@NotNull String s, boolean strict) {
        long output = 0L;
        byte[] b = s.getBytes();
        int[] nanFirstZeros = new int[100];
        int nk = 0;
        for (byte value : b) {
            if (!isNumber(value) && strict) {
                return 0L;
            } else if (isNumber(value)) {
//                output += ((int)b[i] - 48) * pow(10,(b.length - i - 1));
                if ((int) value != 0) {
                    nanFirstZeros[nk] = (int) value - 48;
                    nk += 1;
                }
            } else {
                for (int p = 0; p < nk; p++) {
                    output += nanFirstZeros[p] * pow(10, nk - p - 1);
                }
//                return output / pow(10, b.length - i);
                return output;
            }

        }
        for(int p = 0; p < nk;p++){
            output += nanFirstZeros[p] * pow(10,nk-p-1);
        }
        return output;
    }
    public long getValue(){
        return d1;
    }
    public void setValue(long _d1){
        d1 = _d1;
    }
}
public class Q8 {
    public static void main(String[] args){
//        Object v = new Data("728qad", true);
//        System.out.println(((Data) v).getValue());
        Data f = new Data("003023034ne",false);
        Data g = new Data("2334ne",true);
        System.out.println(f.getValue());
        System.out.println(g.getValue());

    }

}


相关标签: java 字符串