double CPLAtofM( const char *nptr ) { const int nMaxSearch = 50; for( int i = 0; i < nMaxSearch; i++ ) { if( nptr[i] == ',' ) return CPLStrtodDelim( nptr, NULL, ',' ); if( nptr[i] == '.' || nptr[i] == '\0' ) return CPLStrtodDelim( nptr, NULL, '.' ); } return CPLStrtodDelim( nptr, NULL, '.' ); }
/** * Converts ASCII string to floating point number using specified delimiter. * * This function converts the initial portion of the string pointed to * by nptr to single floating point representation. This function does the * same as standard strtof(3), but does not take locale in account. Instead of * locale defined decimal delimiter you can specify your own one. Also see * notes for CPLAtof() function. * * @param nptr Pointer to string to convert. * @param endptr If is not NULL, a pointer to the character after the last * character used in the conversion is stored in the location referenced * by endptr. * @param point Decimal delimiter. * * @return Converted value, if any. */ float CPLStrtofDelim(const char *nptr, char **endptr, char point) { #if defined(HAVE_STRTOF) /* -------------------------------------------------------------------- */ /* We are implementing a simple method here: copy the input string */ /* into the temporary buffer, replace the specified decimal delimiter */ /* with the one, taken from locale settings and use standard strtof() */ /* on that buffer. */ /* -------------------------------------------------------------------- */ double dfValue; int nError; char* pszNumber = CPLReplacePointByLocalePoint(nptr, point); dfValue = strtof( pszNumber, endptr ); nError = errno; if ( endptr ) *endptr = (char *)nptr + (*endptr - pszNumber); if (pszNumber != (char*) nptr) CPLFree( pszNumber ); errno = nError; return dfValue; #else return (float)CPLStrtodDelim(nptr, endptr, point); #endif /* HAVE_STRTOF */ }
double CPLAtofM( const char *nptr ) { int i; const static int nMaxSearch = 50; for( i = 0; i < nMaxSearch; i++ ) { if( nptr[i] == ',' ) return CPLStrtodDelim( nptr, 0, ',' ); else if( nptr[i] == '.' || nptr[i] == '\0' ) return CPLStrtodDelim( nptr, 0, '.' ); } return CPLStrtodDelim( nptr, 0, '.' ); }
/** * Converts ASCII string to floating point number. * * This function converts the initial portion of the string pointed to * by nptr to double floating point representation. The behaviour is the * same as * * CPLStrtodDelim(nptr, (char **)NULL, point); * * This function does the same as standard atof(3), but does not take locale * in account. Instead of locale defined decimal delimiter you can specify * your own one. Also see notes for CPLAtof() function. * * @param nptr Pointer to string to convert. * @param point Decimal delimiter. * * @return Converted value, if any. */ double CPLAtofDelim(const char *nptr, char point) { return CPLStrtodDelim(nptr, 0, point); }
/** * Converts ASCII string to floating point number. * * This function converts the initial portion of the string pointed to * by nptr to double floating point representation. This function does the * same as standard strtod(3), but does not take locale in account. That * means, the decimal delimiter is always '.' (decimal point). Use * CPLStrtodDelim() function if you want to specify custom delimiter. Also * see notes for CPLAtof() function. * * @param nptr Pointer to string to convert. * @param endptr If is not NULL, a pointer to the character after the last * character used in the conversion is stored in the location referenced * by endptr. * * @return Converted value, if any. */ double CPLStrtod(const char *nptr, char **endptr) { return CPLStrtodDelim(nptr, endptr, '.'); }