mirror of https://github.com/exaloop/codon.git
Fix underscore float parsing (#596)
* Fix underscore float parsing * Add tests * Update float parsing --------- Co-authored-by: A. R. Shajii <ars@ars.me>pull/619/head
parent
d45646dc41
commit
37ff25a907
|
@ -2,6 +2,8 @@
|
|||
|
||||
#include "expr.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <iterator>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
@ -149,9 +151,14 @@ FloatExpr::FloatExpr(double floatValue)
|
|||
this->floatValue = std::make_unique<double>(floatValue);
|
||||
}
|
||||
FloatExpr::FloatExpr(const std::string &value, std::string suffix)
|
||||
: Expr(), value(value), suffix(std::move(suffix)) {
|
||||
: Expr(), value(), suffix(std::move(suffix)) {
|
||||
this->value.reserve(value.size());
|
||||
std::copy_if(value.begin(), value.end(), std::back_inserter(this->value),
|
||||
[](char c) { return c != '_'; });
|
||||
|
||||
double result;
|
||||
auto r = fast_float::from_chars(value.data(), value.data() + value.size(), result);
|
||||
auto r = fast_float::from_chars(this->value.data(),
|
||||
this->value.data() + this->value.size(), result);
|
||||
if (r.ec == std::errc() || r.ec == std::errc::result_out_of_range)
|
||||
floatValue = std::make_unique<double>(result);
|
||||
else
|
||||
|
|
|
@ -39,6 +39,8 @@ print 1844674407_3709551999 #! integer '18446744073709551999' cannot fit into 64
|
|||
print 5.15 #: 5.15
|
||||
print 2e2 #: 200
|
||||
print 2.e-2 #: 0.02
|
||||
print 1_000.0 #: 1000
|
||||
print 1_000e9 #: 1e+12
|
||||
|
||||
#%% float_suffix,barebones
|
||||
@extend
|
||||
|
|
Loading…
Reference in New Issue