@@ -330,9 +330,16 @@ namespace nfx::time
330330 if ( iso8601DurationString.find_first_not_of ( " 0123456789.-" ) == std::string_view::npos )
331331 {
332332 double seconds{};
333+ #ifdef __EMSCRIPTEN__
334+ // Emscripten doesn't support std::from_chars for floating point
335+ char * end;
336+ seconds = std::strtod ( iso8601DurationString.data (), &end );
337+ if ( end == iso8601DurationString.data () + iso8601DurationString.size () )
338+ #else
333339 auto [ptr, ec] = std::from_chars (
334340 iso8601DurationString.data (), iso8601DurationString.data () + iso8601DurationString.size (), seconds );
335341 if ( ec == std::errc{} && ptr == iso8601DurationString.data () + iso8601DurationString.size () )
342+ #endif
336343 {
337344 result = TimeSpan::fromSeconds ( seconds );
338345 return true ;
@@ -366,8 +373,14 @@ namespace nfx::time
366373 if ( dPos != std::string_view::npos )
367374 {
368375 auto dayStr{ datePart.substr ( 0 , dPos ) };
376+ #ifdef __EMSCRIPTEN__
377+ char * end;
378+ days = std::strtod ( dayStr.data (), &end );
379+ if ( end == dayStr.data () + dayStr.size () )
380+ #else
369381 auto [ptr, ec] = std::from_chars ( dayStr.data (), dayStr.data () + dayStr.size (), days );
370382 if ( ec == std::errc{} && ptr == dayStr.data () + dayStr.size () )
383+ #endif
371384 {
372385 foundComponent = true ;
373386 }
@@ -428,8 +441,14 @@ namespace nfx::time
428441 {
429442 auto hourStr{ timePart.substr ( 0 , hPos ) };
430443 double hours{};
444+ #ifdef __EMSCRIPTEN__
445+ char * end;
446+ hours = std::strtod ( hourStr.data (), &end );
447+ if ( end == hourStr.data () + hourStr.size () )
448+ #else
431449 auto [ptr, ec] = std::from_chars ( hourStr.data (), hourStr.data () + hourStr.size (), hours );
432450 if ( ec == std::errc{} && ptr == hourStr.data () + hourStr.size () )
451+ #endif
433452 {
434453 totalSeconds += hours * static_cast <double >( constants::SECONDS_PER_HOUR );
435454 timePart = timePart.substr ( hPos + 1 );
@@ -447,8 +466,14 @@ namespace nfx::time
447466 {
448467 auto minuteStr{ timePart.substr ( 0 , mPos ) };
449468 double minutes{};
469+ #ifdef __EMSCRIPTEN__
470+ char * end;
471+ minutes = std::strtod ( minuteStr.data (), &end );
472+ if ( end == minuteStr.data () + minuteStr.size () )
473+ #else
450474 auto [ptr, ec] = std::from_chars ( minuteStr.data (), minuteStr.data () + minuteStr.size (), minutes );
451475 if ( ec == std::errc{} && ptr == minuteStr.data () + minuteStr.size () )
476+ #endif
452477 {
453478 totalSeconds += minutes * static_cast <double >( constants::SECONDS_PER_MINUTE );
454479 timePart = timePart.substr ( mPos + 1 );
@@ -466,8 +491,14 @@ namespace nfx::time
466491 {
467492 auto secondStr{ timePart.substr ( 0 , sPos ) };
468493 double seconds{};
494+ #ifdef __EMSCRIPTEN__
495+ char * end;
496+ seconds = std::strtod ( secondStr.data (), &end );
497+ if ( end == secondStr.data () + secondStr.size () )
498+ #else
469499 auto [ptr, ec] = std::from_chars ( secondStr.data (), secondStr.data () + secondStr.size (), seconds );
470500 if ( ec == std::errc{} && ptr == secondStr.data () + secondStr.size () )
501+ #endif
471502 {
472503 totalSeconds += seconds;
473504 foundComponent = true ;
0 commit comments