void gsb_real_cunit__gsb_real_raw_get_from_string__locale( void ) { GsbReal val; /* // locale's thousands separator override comma */ val = gsb_real_raw_get_from_string ( "1,000.00", ",", "." ); CU_ASSERT_EQUAL ( 100000, val.mantissa ); CU_ASSERT_EQUAL ( 2, val.exponent ); /* // utf8 thousands separator (non-break space) */ gchar tmp[] = { '1', 0xC2, 0xA0, '0', '0', '0', '.', '0', '0', 0x0 }; val = gsb_real_raw_get_from_string ( tmp, "\xC2\xA0", NULL ); CU_ASSERT_EQUAL ( 100000, val.mantissa ); CU_ASSERT_EQUAL ( 2, val.exponent ); /* // non-break space used as separator, but locale says somthing else */ val = gsb_real_raw_get_from_string ( tmp, "\xC2\xA1", NULL ); CU_ASSERT_EQUAL ( G_MININT64, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); }
/** * get a real number from a string * the string can be formatted : * - handle , or . as separator * - spaces are ignored * - another character makes a 0 return * * there is no ask for any exponent, so the gsb_real will be exactly the * same as the string * * \param string * * \return the number in the string transformed to gsb_real * */ gsb_real utils_real_get_from_string ( const gchar *string ) { gsb_real result; gchar *thousands_sep = gsb_locale_get_mon_thousands_sep ( ); gchar *decimal_point = gsb_locale_get_mon_decimal_point ( ); result = gsb_real_raw_get_from_string ( string, thousands_sep, decimal_point ); g_free ( decimal_point ); g_free ( thousands_sep ); return result; }
void gsb_real_cunit__gsb_real_raw_get_from_string( void ) { GsbReal val; /* NULL ==> error */ val = gsb_real_raw_get_from_string ( NULL, NULL, NULL ); CU_ASSERT_EQUAL ( G_MININT64, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); val = gsb_real_raw_get_from_string ( "", NULL, NULL ); /* empty ==> 0 */ CU_ASSERT_EQUAL ( 0, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); val = gsb_real_raw_get_from_string ( "0", NULL, NULL ); CU_ASSERT_EQUAL ( 0, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); val = gsb_real_raw_get_from_string ( "1", NULL, NULL ); CU_ASSERT_EQUAL ( 1, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); val = gsb_real_raw_get_from_string ( "12", NULL, NULL ); CU_ASSERT_EQUAL ( 12, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // ignore left spaces */ val = gsb_real_raw_get_from_string ( " 12", NULL, NULL ); CU_ASSERT_EQUAL ( 12, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // ignore right spaces */ val = gsb_real_raw_get_from_string ( "12 ", NULL, NULL ); CU_ASSERT_EQUAL ( 12, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // ignore left-middle-right spaces */ val = gsb_real_raw_get_from_string ( " 1 2 ", NULL, NULL ); CU_ASSERT_EQUAL ( 12, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // significant zeros */ val = gsb_real_raw_get_from_string ( "12000", NULL, NULL ); CU_ASSERT_EQUAL ( 12000, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // useless zeros */ val = gsb_real_raw_get_from_string ( "00012", NULL, NULL ); CU_ASSERT_EQUAL ( 12, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // comma decimal separator */ val = gsb_real_raw_get_from_string ( "123,45", NULL, NULL ); CU_ASSERT_EQUAL ( 12345, val.mantissa ); CU_ASSERT_EQUAL ( 2, val.exponent ); /* // dot decimal separator */ val = gsb_real_raw_get_from_string ( "123.45", NULL, NULL ); CU_ASSERT_EQUAL ( 12345, val.mantissa ); CU_ASSERT_EQUAL ( 2, val.exponent ); /* // decimal separator with spaces */ val = gsb_real_raw_get_from_string ( " 123 . 45 ", NULL, NULL ); CU_ASSERT_EQUAL ( 12345, val.mantissa ); CU_ASSERT_EQUAL ( 2, val.exponent ); /* // decimal separator with space, and zeroes */ val = gsb_real_raw_get_from_string ( "0 0123.4500", NULL, NULL ); CU_ASSERT_EQUAL ( 1234500, val.mantissa ); CU_ASSERT_EQUAL ( 4, val.exponent ); /* // decimal separator with space, zero, and value less than 1 */ val = gsb_real_raw_get_from_string ( " 0.123 45 ", NULL, NULL ); CU_ASSERT_EQUAL ( 12345, val.mantissa ); CU_ASSERT_EQUAL ( 5, val.exponent ); /* // decimal separator with space, no zero, and value less than 1 */ val = gsb_real_raw_get_from_string ( " .123 45 ", NULL, NULL ); CU_ASSERT_EQUAL ( 12345, val.mantissa ); CU_ASSERT_EQUAL ( 5, val.exponent ); /* // multiple decimal separators ==> error */ val = gsb_real_raw_get_from_string ( " 123 . 45 . ", NULL, NULL ); CU_ASSERT_EQUAL ( G_MININT64, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // large number */ val = gsb_real_raw_get_from_string ( "21000000", NULL, NULL ); CU_ASSERT_EQUAL ( 21000000, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // large number with thousands separators */ val = gsb_real_raw_get_from_string ( "21 000 000", NULL, NULL ); CU_ASSERT_EQUAL ( 21000000, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // large number (largest-1) with thousands separators */ val = gsb_real_raw_get_from_string ( " 2 147 483 646 ", NULL, NULL ); CU_ASSERT_EQUAL ( 2147483646, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // largest positive number with thousands separators */ val = gsb_real_raw_get_from_string ( " 2 147 483 647 ", NULL, NULL ); CU_ASSERT_EQUAL ( 2147483647, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // too large positive number ==> error */ val = gsb_real_raw_get_from_string ( " 2 147 483 648 ", NULL, NULL ); CU_ASSERT_EQUAL ( G_GINT64_CONSTANT(2147483648), val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // too large positive number ==> error */ val = gsb_real_raw_get_from_string ( " 2 147 483 649 ", NULL, NULL ); CU_ASSERT_EQUAL ( G_GINT64_CONSTANT(2147483649), val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // very large positive number ==> error */ val = gsb_real_raw_get_from_string ( " 112 147 483 649 ", NULL, NULL ); CU_ASSERT_EQUAL ( G_GINT64_CONSTANT(112147483649), val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // 0 with positive sign */ val = gsb_real_raw_get_from_string ( "+0", NULL, NULL ); CU_ASSERT_EQUAL ( 0, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // 0 with negative sign */ val = gsb_real_raw_get_from_string ( "-0", NULL, NULL ); CU_ASSERT_EQUAL ( 0, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // negative number */ val = gsb_real_raw_get_from_string ( "-1", NULL, NULL ); CU_ASSERT_EQUAL ( -1, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // positive number */ val = gsb_real_raw_get_from_string ( "+1", NULL, NULL ); CU_ASSERT_EQUAL ( 1, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // negative two digits */ val = gsb_real_raw_get_from_string ( "-12", NULL, NULL ); CU_ASSERT_EQUAL ( -12, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // positive two digits */ val = gsb_real_raw_get_from_string ( "+12", NULL, NULL ); CU_ASSERT_EQUAL ( 12, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // negative sign at unexpected position ==> error */ val = gsb_real_raw_get_from_string ( "1-2", NULL, NULL ); CU_ASSERT_EQUAL ( G_MININT64, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // positive sign at unexpected position ==> error */ val = gsb_real_raw_get_from_string ( "1+2", NULL, NULL ); CU_ASSERT_EQUAL ( G_MININT64, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // two signs ==> error */ val = gsb_real_raw_get_from_string ( "-1+2", NULL, NULL ); CU_ASSERT_EQUAL ( G_MININT64, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // two signs ==> error */ val = gsb_real_raw_get_from_string ( "+1-2", NULL, NULL ); CU_ASSERT_EQUAL ( G_MININT64, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // two signs ==> error */ val = gsb_real_raw_get_from_string ( "--1", NULL, NULL ); CU_ASSERT_EQUAL ( G_MININT64, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // decimal separator, no zero, and value less than 1 */ val = gsb_real_raw_get_from_string ( "-.12345", NULL, NULL ); CU_ASSERT_EQUAL ( -12345, val.mantissa ); CU_ASSERT_EQUAL ( 5, val.exponent ); /* // large negative number (largest+1) with thousands separators */ val = gsb_real_raw_get_from_string ( " -2 147 483 646 ", NULL, NULL ); CU_ASSERT_EQUAL ( -2147483646, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // largest negative number with thousands separators */ val = gsb_real_raw_get_from_string ( " -2 147 483 647 ", NULL, NULL ); CU_ASSERT_EQUAL ( -2147483647, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* G_MININT - 1 */ val = gsb_real_raw_get_from_string ( " -2 147 483 648 ", NULL, NULL ); CU_ASSERT_EQUAL ( G_GINT64_CONSTANT(-2147483648), val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* G_MININT - 2 */ val = gsb_real_raw_get_from_string ( " -2 147 483 649 ", NULL, NULL ); CU_ASSERT_EQUAL ( G_GINT64_CONSTANT(-2147483649), val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* large negative number */ val = gsb_real_raw_get_from_string ( " -112 147 483 649 ", NULL, NULL ); CU_ASSERT_EQUAL ( G_GINT64_CONSTANT(-112147483649), val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); /* // error number as string ==> error */ val = gsb_real_raw_get_from_string ( ERROR_REAL_STRING, NULL, NULL ); CU_ASSERT_EQUAL ( G_MININT64, val.mantissa ); CU_ASSERT_EQUAL ( 0, val.exponent ); }