static fs_value cast_decimal(fs_value a) { if (a.valid & fs_valid_bit(FS_V_DE)) { return a; } if (a.valid & fs_valid_bit(FS_V_FP)) { a.valid |= fs_valid_bit(FS_V_DE); fs_decimal_init_from_double(&a.de, a.fp); return a; } if (a.valid & fs_valid_bit(FS_V_IN)) { a.valid |= fs_valid_bit(FS_V_DE); fs_decimal_init_from_int64(&a.de, a.in); return a; } if (a.lex && strlen(a.lex)) { a.valid |= fs_valid_bit(FS_V_DE); if (!fs_decimal_init_from_str(&a.de, a.lex)) { return a; } } return fs_value_error(FS_ERROR_INVALID_TYPE, "bad cast to decimal"); }
int fs_decimal_init_from_double(fs_decimal *d, double v) { char tmp[256]; snprintf(tmp, 255, "%20.20f", v); return fs_decimal_init_from_str(d, tmp); }
fs_value fs_value_decimal_from_string(const char *s) { fs_value v = fs_value_blank(); int ret = fs_decimal_init_from_str(&v.de, s); if (ret) { return fs_value_error(FS_ERROR_INVALID_TYPE, "cannot convert value to decimal"); } v.attr = fs_c.xsd_decimal; v.valid = fs_valid_bit(FS_V_DE); return v; }