UdonLibrary 1.0.0
機械システム研究部 C++ ライブラリ
読み取り中…
検索中…
一致する文字列を見つけられません
StringToNumberParser.hpp
[詳解]
1//
2// 文字列を数値に変換する関数群
3//
4// Copyright (c) 2022-2024 udonrobo
5//
6
7#pragma once
8
11
12#include <string>
13#include <stdlib.h>
14
15namespace Udon
16{
17
18 namespace StringToNumberParser
19 {
20
27 template <typename T>
28 inline Udon::Optional<T> Parse(const char* const begin, const char* const end, const int radix)
29 {
30 static_assert(Traits::AlwaysFalse<T>::value, "T is not parsable.");
31 }
32
33 template <>
34 inline Udon::Optional<long> Parse<long>(const char* const begin, const char* const end, const int radix)
35 {
36 char* endPtr = nullptr;
37
38 const auto result = strtol(begin, &endPtr, radix);
39
40 // Arduino nano では errno が定義されていないため、errno によるエラー判定は行わない
41
42 if (endPtr == end)
43 {
44 return result;
45 }
46 else
47 {
48 return Udon::nullopt;
49 }
50 }
51
52 template <>
53 inline Udon::Optional<int> Parse<int>(const char* const begin, const char* const end, const int radix)
54 {
55 return Parse<long>(begin, end, radix);
56 }
57
58 template <>
59 inline Udon::Optional<double> Parse<double>(const char* const begin, const char* const end, const int /*radix*/)
60 {
61 char* endPtr = nullptr;
62
63 const auto result = strtod(begin, &endPtr);
64
65 if (endPtr == end)
66 {
67 return result;
68 }
69 else
70 {
71 return Udon::nullopt;
72 }
73 }
74
75 template <>
76 inline Udon::Optional<float> Parse<float>(const char* const begin, const char* const end, const int /*radix*/)
77 {
78 char* endPtr = nullptr;
79
80#if defined(ARDUINO_AVR_NANO) || defined(ARDUINO_AVR_UNO) || defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2560)
81
82 // nano 系統にstrtofが定義されていなかった
83 const float result = static_cast<float>(strtod(begin, &endPtr));
84
85#else
86
87 const float result = strtof(begin, &endPtr);
88
89#endif
90
91 if (endPtr == end)
92 {
93 return result;
94 }
95 else
96 {
97 return Udon::nullopt;
98 }
99 }
100
101 } // namespace StringToNumberParser
102
103} // namespace Udon
オプショナル型
Definition Optional.hpp:62
Udon::Optional< T > Parse(const char *const begin, const char *const end, const int radix)
文字列を数値に変換する
Definition StringToNumberParser.hpp:28
Udon::Optional< int > Parse< int >(const char *const begin, const char *const end, const int radix)
Definition StringToNumberParser.hpp:53
Udon::Optional< float > Parse< float >(const char *const begin, const char *const end, const int)
Definition StringToNumberParser.hpp:76
Udon::Optional< long > Parse< long >(const char *const begin, const char *const end, const int radix)
Definition StringToNumberParser.hpp:34
Udon::Optional< double > Parse< double >(const char *const begin, const char *const end, const int)
Definition StringToNumberParser.hpp:59
Definition Bit.hpp:12
constexpr NulloptT nullopt
無効値
Definition Optional.hpp:52
static_assert 失敗遅延用の型
Definition AlwaysFalse.hpp:39