-
-
Save cristobal/20f3ec5040657203efd285042eb8e16b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { u128 } from 'near-sdk-as'; | |
/** | |
* Hack to expand f64 vales represented with exponent to a string | |
* that can be parsed via u128.fromString(value) e.g.: | |
* - 1.0e+23 is expanded to 100000000000000000000000 | |
* - 2.5e+23 is expanded to 250000000000000000000000 | |
*/ | |
function parseF64ValueToString(value: f64): string { | |
const repr = value.toString(); | |
if (repr.indexOf('e+') < 0) { | |
return repr; | |
} | |
const elements = repr.split('e+'); | |
const val = elements[0]; | |
const args = [ | |
val.charAt(0) | |
]; | |
let stop = val.indexOf('0') > 0 | |
? val.indexOf('0') | |
: val.length; | |
for (let i = 2; i < stop; i++) { | |
args.push(val.charAt(i)); | |
} | |
const exp = parseInt(elements[1]) as i32; | |
stop = exp - (args.length - 1); | |
for (let i = 0; i < stop; i++) { | |
args.push('0'); | |
} | |
return args.join(''); | |
} | |
export function small_values_ok():u128[] { | |
return [ | |
u128.fromF64(parseFloat('10') as f64), | |
u128.fromF64(parseFloat('100') as f64), | |
u128.fromF64(parseFloat('1000') as f64), | |
u128.fromF64(parseFloat('10000') as f64), | |
u128.fromF64(parseFloat('100000') as f64), | |
u128.fromF64(parseFloat('10000000') as f64) | |
] | |
} | |
export function large_values_from_f64_fails_with_error(): u128[] { | |
return [ | |
u128.fromF64( | |
parseFloat('1000000000000000000000000') as f64 | |
) | |
] | |
} | |
export function large_values_from_f64_string_to_wrong_values(): u128[] { | |
return [ | |
u128.fromString( | |
(parseFloat('1000000000000000000000000') as f64).toString() | |
), | |
u128.fromString( | |
(parseFloat('2500000000000000000000000') as f64).toString() | |
) | |
] | |
} | |
export function large_values_ok(): u128[] { | |
return [ | |
u128.fromString( | |
parseF64ValueToString( | |
parseFloat('1000000000000000000000000') as f64 | |
) | |
), | |
u128.fromString( | |
parseF64ValueToString( | |
parseFloat('2500000000000000000000000') as f64 | |
) | |
) | |
] | |
} | |
export function large_values_repr():string[] { | |
return [ | |
(parseFloat('1000000000000000000000000') as f64).toString(), | |
(parseFloat('2500000000000000000000000') as f64).toString() | |
] | |
} | |
export function large_values_repr_parsed():string[] { | |
return [ | |
parseF64ValueToString( | |
parseFloat('1000000000000000000000000') as f64 | |
), | |
parseF64ValueToString( | |
parseFloat('2500000000000000000000000') as f64 | |
) | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment