Thread overview
base/radix parameter in conv.d
Oct 05, 2004
ano
Oct 05, 2004
Sjoerd van Leent
Oct 05, 2004
Burton Radons
Oct 05, 2004
Sjoerd van Leent
Oct 06, 2004
ano
Oct 05, 2004
Burton Radons
Oct 05, 2004
Burton Radons
October 05, 2004
hey,

in conv.d (phobos/std) there are some routines for string conversion (toInt(),
toLong(),..). am i missing something or are there no functions with a 'radix'
parameter for e.g. 16 == hex, 8 == octal, ...

right now i'm using "extern (C) strtoul()" wrapper to read hexadecimal color
codes from some file but i assumed such things to be present in the D standard
library.

what do you think?


October 05, 2004
ano wrote:
> hey,
> 
> in conv.d (phobos/std) there are some routines for string conversion (toInt(),
> toLong(),..). am i missing something or are there no functions with a 'radix'
> parameter for e.g. 16 == hex, 8 == octal, ... 
> 
> right now i'm using "extern (C) strtoul()" wrapper to read hexadecimal color
> codes from some file but i assumed such things to be present in the D standard
> library.
> 
> what do you think?
> 
> 

Can't you use std.format.doFormat(...), this should be able to do just that.

Regards,
Sjoerd
October 05, 2004
ano wrote:

> in conv.d (phobos/std) there are some routines for string conversion (toInt(),
> toLong(),..). am i missing something or are there no functions with a 'radix'
> parameter for e.g. 16 == hex, 8 == octal, ...

std.conv is very limited, to the point where I haven't found any utility in it.  I've attached a quick and dirty module I've hacked together for string-to-number conversion; I just wrote it this moment so yeah. Here's the docs from the top of the file:

void string_to (
     {char,wchar,dchar} [] string,
     out {int,uint,long,ulong,float,double,real} value,
     type_flags flags = default_flags,
     out size_t end_offset = null);

These functions convert a string into an integer or floating-point type, handling every form for C/C++, D, and C#, as well as some extras.  You can also configure it to only handle a subset of the functionality through the flags parameter.

These are the parameters:

     string is the string to convert; it can be a UTF-8, UTF-16, or
     UTF-32 string.

     value is the value to output to; it can be of type int, uint,
     long, ulong, float, double, or real.

     flags, if provided, sets the subset of numbers that can be
     converted.  This will be detailed later.  To act like various
     languages, you can use c_flags_int, c_flags_float, d_flags_int,
     d_flags_float, csharp_flags_int, or csharp_flags_float.

     end_offset, if provided, is stored with the array index that
     processing terminated on.

This can throw a set of errors:

     class_error_overflow is thrown if an overflow is detected when
     reading numbers.

     class_error_no_number_found is thrown if processing terminates
     without any digits read.

Here are the string formats which can be parsed:

     "    45" (unless if flags.whitespace is false)
     "-4", "+8" (unless if flags.sign is false)
     "0x8F", "0X5" (unless if flags.hex is false)
     "8Fh", "AH" (unless if flags.hex_suffix is false)
     "0770" (unless if flags.oct is false)
     "0B1011", "0b1111" (unless if flags.bin is false)
     "1_004" (unless if flags.underlines is false)
     "45e4" (float only - unless if flags.exp is false)
     "16^-8" (float only - unless if flags.exp_hexbin is false)

flags.exp_hexbin is crazy stuff for D.  Maybe it's normal to work that way, I don't know.  flags.radix can be used to set the default radix if none others are provided.



October 05, 2004
Sjoerd van Leent wrote:

> ano wrote:
> 
>> in conv.d (phobos/std) there are some routines for string conversion (toInt(),
>> toLong(),..). am i missing something or are there no functions with a 'radix'
>> parameter for e.g. 16 == hex, 8 == octal, ...
>> right now i'm using "extern (C) strtoul()" wrapper to read hexadecimal color
>> codes from some file but i assumed such things to be present in the D standard
>> library.
>>
>> what do you think?
> 
> Can't you use std.format.doFormat(...), this should be able to do just that.

He wants to go in the other direction.
October 05, 2004
Oops, renamed wstring_to and dstring_to to string_to; I had them that way because I was passing literals to string_to which DMD can't disambiguate.
October 05, 2004
Burton Radons wrote:
> Sjoerd van Leent wrote:
> 
>> ano wrote:
>>
>>> in conv.d (phobos/std) there are some routines for string conversion (toInt(),
>>> toLong(),..). am i missing something or are there no functions with a 'radix'
>>> parameter for e.g. 16 == hex, 8 == octal, ...
>>> right now i'm using "extern (C) strtoul()" wrapper to read hexadecimal color
>>> codes from some file but i assumed such things to be present in the D standard
>>> library.
>>>
>>> what do you think?
>>
>>
>> Can't you use std.format.doFormat(...), this should be able to do just that.
> 
> 
> He wants to go in the other direction.

My fault, I wasn't paying attention. I don't use the standard C functions very much (I normally use the C++ stream library for that purpose).

Regards,
Sjoerd
October 06, 2004
In article <cjv46l$tt9$1@digitaldaemon.com>, Sjoerd van Leent says...
>
>> Sjoerd van Leent wrote:
>> 
>
>My fault, I wasn't paying attention. I don't use the standard C functions very much (I normally use the C++ stream library for that purpose).
>
>Regards,
>Sjoerd

thanks all, i'll have more thorough look into that soon. there're a gazillion ways to convert strings in C/C++/D ...