Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 14 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,40 +58,44 @@ Example:
#include "fast_float/fast_float.h"
#include <iostream>
#include <string>
#include <system_error>

int main() {
std::string input = "3.1416 xyz ";
const std::string input = "3.1416 xyz ";
double result;
auto answer = fast_float::from_chars(input.data(), input.data() + input.size(), result);
if (answer.ec != std::errc()) { std::cerr << "parsing failure\n"; return EXIT_FAILURE; }
std::cout << "parsed the number " << result << std::endl;
if (answer.ec != std::errc()) {
std::cerr << "parsing failure\n";
return EXIT_FAILURE;
}
std::cout << "parsed the number " << result << '\n';
return EXIT_SUCCESS;
}
```

Though the C++17 standard has you do a comparison with `std::errc()` to check whether the conversion worked, you can avoid it by casting the result to a `bool` like so:
You can simplify the conversion success check by casting the result of `from_chars` to `bool`, as shown below:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The original text sounds clunky but it makes an important point that this edit removes. The C++17 standard does not include this cast to bool. It's important for users to know that it is a fast_float extension.

The cast to bool only became standard in C++26. https://en.cppreference.com/w/cpp/utility/from_chars_result.html

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, there is still room for improvement. The point is that I did not understand the actual purpose of the original statement. Neither does it mention C++26.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The original wording is valid English, but how about:

In C++17, to check whether the conversion succeeded, you must compare the ec member to std::errc(). As an extension, fast float supports the C++26 feature that allows you to cast the result to bool, like so:

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, that's easier to comprehend for non-native English speakers. So what about C++20 then?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Everything else in that document talks about C++17 from_chars, and I think it should be obvious that unless stated otherwise, the same API is present in C++20 and C++23.

Copy link
Author

@thbeu thbeu Sep 21, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about this?

Whereas before C++26 std::from_chars needs to be explicitily compared with std::errc() to check for conversion success, fast_float::from_chars simplifies the check as shown below:

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

from_chars is a function, you don't compare it to std::errc(), and you don't even compare its return value to std::errc(), so I don't think that's good.

"to check for a successful conversion" would be better than "to check for conversion success".

I don't think there's a problem with simply referring to C++17 as the standard that defined the from_chars feature, but if you insist, then maybe:

Prior to C++26, checking for a successful std::from_chars conversion requires comparing the from_chars_result::ec member to std::errc(). As an extension fast_float::from_chars supports the improved C++26 API that allows checking the result by converting it to bool, like so:


```cpp
```C++
#include "fast_float/fast_float.h"
#include <iostream>
#include <string>

int main() {
std::string input = "3.1416 xyz ";
const std::string input = "3.1416 xyz ";
double result;
if(auto answer = fast_float::from_chars(input.data(), input.data() + input.size(), result)) {
std::cout << "parsed the number " << result << std::endl;
if (auto answer = fast_float::from_chars(input.data(), input.data() + input.size(), result)) {
std::cout << "parsed the number " << result << '\n';
return EXIT_SUCCESS;
}
std::cerr << "failed to parse " << result << std::endl;
std::cerr << "parsing failure\n";
return EXIT_FAILURE;
}
```

You can parse delimited numbers:

```C++
std::string input = "234532.3426362,7869234.9823,324562.645";
const std::string input = "234532.3426362,7869234.9823,324562.645";
double result;
auto answer = fast_float::from_chars(input.data(), input.data() + input.size(), result);
if (answer.ec != std::errc()) {
Expand Down