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());
}
}