mirror of
https://github.com/BelfrySCAD/BOSL2.git
synced 2025-01-01 09:49:45 +00:00
Fixed bug in fmtf()
This commit is contained in:
parent
19ed457e38
commit
9b87420c12
2 changed files with 106 additions and 82 deletions
68
strings.scad
68
strings.scad
|
@ -92,9 +92,10 @@ function str_int(str,base=10) =
|
||||||
_str_int_recurse(str,base,len(str)-1);
|
_str_int_recurse(str,base,len(str)-1);
|
||||||
|
|
||||||
function _str_int_recurse(str,base,i) =
|
function _str_int_recurse(str,base,i) =
|
||||||
let( digit = search(str[i],"0123456789abcdef"),
|
let(
|
||||||
last_digit = digit == [] || digit[0] >= base ? (0/0) : digit[0])
|
digit = search(str[i],"0123456789abcdef"),
|
||||||
i==0 ? last_digit :
|
last_digit = digit == [] || digit[0] >= base ? (0/0) : digit[0]
|
||||||
|
) i==0 ? last_digit :
|
||||||
_str_int_recurse(str,base,i-1)*base + last_digit;
|
_str_int_recurse(str,base,i-1)*base + last_digit;
|
||||||
|
|
||||||
// Function: str_float()
|
// Function: str_float()
|
||||||
|
@ -162,20 +163,19 @@ function str_frac(str,mixed=true,improper=true,signed=true) =
|
||||||
signed && str[0]=="-" ? -str_frac(substr(str,1),mixed=mixed,improper=improper,signed=false) :
|
signed && str[0]=="-" ? -str_frac(substr(str,1),mixed=mixed,improper=improper,signed=false) :
|
||||||
signed && str[0]=="+" ? str_frac(substr(str,1),mixed=mixed,improper=improper,signed=false) :
|
signed && str[0]=="+" ? str_frac(substr(str,1),mixed=mixed,improper=improper,signed=false) :
|
||||||
mixed ? (
|
mixed ? (
|
||||||
str_find(str," ")>0 || is_undef(str_find(str,"/")) ?
|
str_find(str," ")>0 || is_undef(str_find(str,"/"))? (
|
||||||
let(whole = str_split(str,[" "]))
|
let(whole = str_split(str,[" "]))
|
||||||
_str_int_recurse(whole[0],10,len(whole[0])-1) + str_frac(whole[1], mixed=false, improper=improper, signed=false)
|
_str_int_recurse(whole[0],10,len(whole[0])-1) + str_frac(whole[1], mixed=false, improper=improper, signed=false)
|
||||||
:
|
) : str_frac(str,mixed=false, improper=improper)
|
||||||
str_frac(str,mixed=false, improper=improper)
|
) : (
|
||||||
)
|
|
||||||
:
|
|
||||||
let(split = str_split(str,"/"))
|
let(split = str_split(str,"/"))
|
||||||
len(split)!=2 ? (0/0) :
|
len(split)!=2 ? (0/0) :
|
||||||
let(numerator = _str_int_recurse(split[0],10,len(split[0])-1),
|
let(
|
||||||
denominator = _str_int_recurse(split[1],10,len(split[1])-1))
|
numerator = _str_int_recurse(split[0],10,len(split[0])-1),
|
||||||
!improper && numerator>=denominator? (0/0) :
|
denominator = _str_int_recurse(split[1],10,len(split[1])-1)
|
||||||
|
) !improper && numerator>=denominator? (0/0) :
|
||||||
denominator<0 ? (0/0) : numerator/denominator;
|
denominator<0 ? (0/0) : numerator/denominator;
|
||||||
|
)
|
||||||
|
|
||||||
// Function: str_num()
|
// Function: str_num()
|
||||||
// Usage:
|
// Usage:
|
||||||
|
@ -225,11 +225,15 @@ function str_split(str,sep,keep_nulls=true) =
|
||||||
|
|
||||||
function str_split_recurse(str,sep,i,result) =
|
function str_split_recurse(str,sep,i,result) =
|
||||||
i == len(sep) ? concat(result,[str]) :
|
i == len(sep) ? concat(result,[str]) :
|
||||||
let( pos = search(sep[i], str),
|
let(
|
||||||
|
pos = search(sep[i], str),
|
||||||
end = pos==[] ? len(str) : pos[0]
|
end = pos==[] ? len(str) : pos[0]
|
||||||
)
|
)
|
||||||
str_split_recurse(substr(str,end+1), sep, i+1,
|
str_split_recurse(
|
||||||
concat(result, [substr(str,0,end)]));
|
substr(str,end+1),
|
||||||
|
sep, i+1,
|
||||||
|
concat(result, [substr(str,0,end)])
|
||||||
|
);
|
||||||
|
|
||||||
function _remove_empty_strs(list) =
|
function _remove_empty_strs(list) =
|
||||||
list_remove(list, search([""], list,0)[0]);
|
list_remove(list, search([""], list,0)[0]);
|
||||||
|
@ -288,11 +292,15 @@ function str_find(str,pattern,start=undef,last=false,all=false) =
|
||||||
_str_find_first(str,pattern,len(str)-len(pattern),start);
|
_str_find_first(str,pattern,len(str)-len(pattern),start);
|
||||||
|
|
||||||
function _str_find_first(str,pattern,max_sindex,sindex) =
|
function _str_find_first(str,pattern,max_sindex,sindex) =
|
||||||
sindex<=max_sindex && !_str_cmp(str,sindex, pattern) ? _str_find_first(str,pattern,max_sindex,sindex+1) :
|
sindex<=max_sindex && !_str_cmp(str,sindex, pattern)?
|
||||||
|
_str_find_first(str,pattern,max_sindex,sindex+1) :
|
||||||
(sindex <= max_sindex ? sindex : undef);
|
(sindex <= max_sindex ? sindex : undef);
|
||||||
|
|
||||||
function _str_find_last(str,pattern,sindex) =
|
function _str_find_last(str,pattern,sindex) =
|
||||||
sindex>=0 && !_str_cmp(str,sindex, pattern) ? _str_find_last(str,pattern,sindex-1) :
|
sindex>=0 && !_str_cmp(str,sindex, pattern)?
|
||||||
|
_str_find_last(str,pattern,sindex-1) :
|
||||||
(sindex >=0 ? sindex : undef);
|
(sindex >=0 ? sindex : undef);
|
||||||
|
|
||||||
function _str_find_all(str,pattern) =
|
function _str_find_all(str,pattern) =
|
||||||
pattern == "" ? list_range(len(str)) :
|
pattern == "" ? list_range(len(str)) :
|
||||||
[for(i=[0:1:len(str)-len(pattern)]) if (_str_cmp(str,i,pattern)) i];
|
[for(i=[0:1:len(str)-len(pattern)]) if (_str_cmp(str,i,pattern)) i];
|
||||||
|
@ -422,18 +430,34 @@ function fmti(i,mindigits=1) =
|
||||||
// fmtf(PI,12); // Returns: "3.14159265359"
|
// fmtf(PI,12); // Returns: "3.14159265359"
|
||||||
// fmtf([PI,-16.75],12); // Returns: "[3.14159265359, -16.75]"
|
// fmtf([PI,-16.75],12); // Returns: "[3.14159265359, -16.75]"
|
||||||
function fmtf(f,sig=12) =
|
function fmtf(f,sig=12) =
|
||||||
|
assert(is_num(f))
|
||||||
|
assert(is_int(sig))
|
||||||
|
assert(sig>0)
|
||||||
is_list(f)? str("[",str_join(sep=", ", [for (g=f) fmtf(g,sig=sig)]),"]") :
|
is_list(f)? str("[",str_join(sep=", ", [for (g=f) fmtf(g,sig=sig)]),"]") :
|
||||||
f==0? "0" :
|
f==0? "0" :
|
||||||
str(f)=="nan"? "nan" :
|
str(f)=="nan"? "nan" :
|
||||||
str(f)=="inf"? "inf" :
|
str(f)=="inf"? "inf" :
|
||||||
f<0? str("-",fmtf(-f,sig=sig)) :
|
f<0? str("-",fmtf(-f,sig=sig)) :
|
||||||
let(e=floor(log(f)+1e-15))
|
|
||||||
(e<-sig/2||e>=sig)? str(fmtf(f*pow(10,-e),sig=sig),"e",e) :
|
|
||||||
let(
|
let(
|
||||||
whole=floor(f),
|
e = floor(log(f)),
|
||||||
part=floor((f-whole)*pow(10,sig-e-1)+0.5)
|
mv = sig - e - 1
|
||||||
|
) mv == 0? fmti(floor(f + 0.5)) :
|
||||||
|
(e<-sig/2||mv<0)? str(fmtf(f*pow(10,-e),sig=sig),"e",e) :
|
||||||
|
let(
|
||||||
|
ff = f + pow(10,-mv)*0.5,
|
||||||
|
whole = floor(ff),
|
||||||
|
part = floor((ff-whole) * pow(10,mv))
|
||||||
)
|
)
|
||||||
part>0? str(fmti(whole), str_strip_trailing(str(".",fmti(part,mindigits=sig-e-1)),"0.")) : fmti(whole);
|
str_join([
|
||||||
|
str(whole),
|
||||||
|
str_strip_trailing(
|
||||||
|
str_join([
|
||||||
|
".",
|
||||||
|
fmti(part, mindigits=mv)
|
||||||
|
]),
|
||||||
|
"0."
|
||||||
|
)
|
||||||
|
]);
|
||||||
|
|
||||||
|
|
||||||
// vim: noexpandtab tabstop=4 shiftwidth=4 softtabstop=4 nowrap
|
// vim: noexpandtab tabstop=4 shiftwidth=4 softtabstop=4 nowrap
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
BOSL_VERSION = [2,0,155];
|
BOSL_VERSION = [2,0,156];
|
||||||
|
|
||||||
|
|
||||||
// Section: BOSL Library Version Functions
|
// Section: BOSL Library Version Functions
|
||||||
|
|
Loading…
Reference in a new issue