Aggiungo altre due soluzioni.
Uso della funzione esterna "
sscanf( ) ".
Se la stringa prevede il simbolo
locale della virgola, anziché il punto, per dividere la parte intera dalla parte frazionaria, oppure se non v'è distizione fra le predette due parti, allora potremo agevolmente...
' int sscanf (const char *__restrict __s, const char *__restrict __format, ...)
' Read formatted input from S.
Private Extern sscanf(__s As String, __format As String, dest As Pointer) As Integer In "libc:6"
Public Sub Main()
Dim s As String = "123,45 testo qualsiasi"
Dim f As Float
sscanf(s, "%lf", VarPtr(f))
Print f
End
Se c'è comunque il punto, allora il codice sarà un po' più complesso:
' int sscanf (const char *__restrict __s, const char *__restrict __format, ...)
' Read formatted input from S.
Private Extern sscanf(__s As String, __format As String, dest As Pointer) As Integer In "libc:6"
Public Sub Main()
Dim s As String = "123.45 testo qualsiasi"
Dim p As Pointer
p = Alloc(SizeOf(gb.Pointer))
sscanf(s, "%s", p)
Print CFloat(String@(p))
Free(p)
End
Volendo usare la funzione esterna "
strtod( )", dovremo prevedere il simbolo
locale della virgola:
' double strtod (const char *__restrict __nptr, char **__restrict __endptr)
' Convert a string to a floating-point number.
Private Extern strtod(__nptr As String, __endptr As Pointer) As Float In "libc:6"
Public Sub Main()
Dim s As String = "123,45 testo qualsiasi"
Dim f As Float
f = strtod(s, 0)
Print f
End
Possiamo usare anche la funzione esterna
memccpy( ):
' void *memccpy (void *__restrict __dest, const void *__restrict __src, int __c, size_t __n)
' Copy no more than N bytes of SRC to DEST, stopping when C is found.
Private Extern memccpy(__dest As Pointer, __src As String, __c As Integer, __n As Long) In "libc:6"
Public Sub Main()
Dim s As String = "123.45 testo qualsasi"
Dim p As Pointer
p = Alloc(SizeOf(gb.Pointer), 1)
memccpy(p, s, 32, CLong(Len(s))) ' 32 è il numero ASCII del carattere dello "spazio"'
Print CFloat(Trim(String@(p)))
Free(p)
End