- Make a string from a single character.
-
- @param
- #n# is a repetition count, default value is 1
- */
-String
-String_convert::char_str (char c, int n)
-{
- n = n >= 0 ? n : 0;
- char* ch_p = new char[ n ];
- memset (ch_p, c, n);
- String s ((Byte*)ch_p, n);
- delete ch_p;
- return s;
-}
-
-String
-String_convert::rational_str (Rational r)
-{
- char * n = Itoa (r.numerator()); // LEAK????
-
- String s = n;
- if (r.denominator() != 1) {
- char * d = Itoa (r.denominator());
- s += String ('/') + String (d);
- //delete d;
- }
-/* delete n;
- */
- return s;
+ Make a string from a single character.
+
+ @param
+ #n# is a repetition count, default value is 1
+*/
+string
+String_convert::char_string (char c, int n)
+{
+ n = n >= 0 ? n : 0;
+ char *ch = new char[ n ];
+ memset (ch, c, n);
+ string s (ch, n);
+
+ delete[] ch;
+ return s;
+}
+
+string
+String_convert::rational_string (Rational r)
+{
+ return r.to_string ();
+}
+
+string
+String_convert::pointer_string (void const *l)
+{
+ char buffer[STRING_BUFFER_LEN];
+ snprintf (buffer, STRING_BUFFER_LEN, "%p", l); // assume radix 10
+ return string (buffer);
+}
+
+/**
+ Convert a double to a string.
+
+ @param
+ #n# is the number of nonzero digits
+*/
+string
+String_convert::precision_string (double x, int n)
+{
+ string format = "%." + ::to_string (max (0, n - 1)) + "e";
+ string str = double_string (abs (x), format.c_str ());
+
+ int exp = dec2int (str.substr (str.length () - 3));
+ str = str.substr (0, str.length () - 4);
+
+ while (str[str.length () - 1] == '0')
+ str = str.substr (0, str.length () - 1);
+ if (str[str.length () - 1] == '.')
+ str = str.substr (0, str.length () - 1);
+
+ if (exp == 0)
+ return (sign (x) > 0 ? str : "-" + str);
+
+ str = str.substr (0, 1) + str.substr (2);
+ ssize dot = 1 + exp;
+ if (dot <= 0)
+ str = "0." + ::to_string ('0', -dot) + str;
+ else if (dot >= str.length ())
+ str += ::to_string ('0', dot - str.length ());
+ else if ((dot > 0) && (dot < str.length ()))
+ str = str.substr (0, dot) + "." + str.substr (dot);
+ else
+ assert (0);
+
+ return (sign (x) > 0 ? str : "-" + str);
+}
+
+string
+String_convert::long_string (long l)
+{
+ char s[STRING_BUFFER_LEN];
+ sprintf (s, "%ld", l);
+ return s;
+}
+
+string
+String_convert::unsigned_string (unsigned u)
+{
+ char s[STRING_BUFFER_LEN];
+ sprintf (s, "%u", u);
+ return s;
+}
+
+string
+String_convert::unsigned_long_string (unsigned long ul)
+{
+ char s[STRING_BUFFER_LEN];
+ sprintf (s, "%lu", ul);
+ return s;
+}
+
+string
+String_convert::pad_to (const string &s, size_t n)
+{
+ return s + string (max (int (n - s.length ()), 0), ' ');
+}
+
+string
+String_convert::to_upper (string s)
+{
+ return strnupr (const_cast<char*>(s.c_str ()), s.length ());
+}
+
+string
+String_convert::to_lower (string s)
+{
+ return strnlwr (const_cast<char*>(s.c_str ()), s.length ());