stdlib_str2num
模块该模块为字符串到数字的转换提供了一种函数风格的接口。它还利用 Fortran 的接口来实现精度相关的算法,以最大限度地提高运行时效率。
to_num
- 将字符串转换为数字实验性
将字符串或字符串数组转换为数值类型。
number =
to_num (string, mold)
string
: 参数具有 intent(in)
并且类型为 character(*)
。
mold
: 参数具有 intent(in)
并且是数值类型(即 integer
或 real
)。**注意**:mold
参数的类型决定了结果的类型。
返回数值类型的标量(即 integer
或 real
)。
program example_string_to_number
use stdlib_kinds, only: dp
use stdlib_str2num, only: to_num
implicit none
character(:), allocatable :: txt
real(dp) :: x
txt = ' 8.8541878128e−12 '
x = to_num( txt , x )
end program example_string_to_number
to_num_from_stream
- 将字符串中的值流转换为数字实验性
将字符串中的值流转换为值数组。
number =
to_num_from_stream (string, mold)
string
: 参数具有 intent(in)
并且类型为 character(:), pointer
。
mold
: 参数具有 intent(in)
并且是数值类型(目前为 integer
或 real
)。**注意**:mold
参数的类型决定了结果的类型。
返回数值类型的标量(即 integer
或 real
)。
program example_stream_of_strings_to_numbers
use stdlib_kinds, only: dp
use stdlib_str2num, only: to_num_from_stream
implicit none
character(:), allocatable, target :: chain
character(len=:), pointer :: cptr
real(dp), allocatable :: r(:), p(:)
integer :: i
chain = " 1.234 1.E1 1e0 0.1234E0 12.21e+001 -34.5E1"
allocate( r(6), p(6) )
!> Example for streamline conversion using `to_num_from_stream`
cptr => chain
do i =1, 6
r(i) = to_num_from_stream( cptr , r(i) ) !> the pointer is shifted within the function
end do
read(chain,*) p
print *, "Reading with to_num_from_stream"
print *, r
print *, "Reading with formatted read"
print *, p
end program example_stream_of_strings_to_numbers
转换的精度取决于实现;建议实现者保证精度达到最后 3 位。
当前实现经过测试,可提供以下精度: :
sp
: 精确匹配
dp
: 精度达到 epsilon(0.0_dp)
qp
: 精度约为 200*epsilon(0.0_qp)
其中,精度指的是 to_num
和 read
之间的相对差异。另一方面,与内在的 read
相比,to_num
的速度提高了 4 倍到 10 倍以上。