32 implicit none ;
private 52 character(len=*),
intent(in) :: input_string
53 character(len=len(input_string)) :: lowercase
55 integer,
parameter :: co=iachar(
'a')-iachar(
'A')
58 lowercase = input_string
59 do k=1, len_trim(input_string)
60 if (lowercase(k:k) >=
'A' .and. lowercase(k:k) <=
'Z') &
61 lowercase(k:k) = achar(ichar(lowercase(k:k))+co)
66 character(len=*),
intent(in) :: input_string
67 character(len=len(input_string)) :: uppercase
72 integer,
parameter :: co=iachar(
'A')-iachar(
'a')
75 uppercase = input_string
76 do k=1, len_trim(input_string)
77 if (uppercase(k:k) >=
'a' .and. uppercase(k:k) <=
'z') &
78 uppercase(k:k) = achar(ichar(uppercase(k:k))+co)
86 character(len=19) :: left_int
87 integer,
intent(in) :: i
89 character(len=19) :: tmp
90 write(tmp(1:19),
'(I19)') i
91 write(left_int(1:19),
'(A)') adjustl(tmp)
98 character(len=1320) :: left_ints
99 integer,
intent(in) :: i(:)
101 character(len=1320) :: tmp
103 write(left_ints(1:1320),
'(A)') trim(
left_int(i(1)))
107 write(left_ints(1:1320),
'(A,", ",A)') trim(tmp),trim(
left_int(i(j)))
113 real,
intent(in) :: val
114 character(len=32) :: left_real
118 if ((abs(val) < 1.0e4) .and. (abs(val) >= 1.0e-3))
then 119 write(left_real,
'(F30.11)') val
121 write(left_real,
'(F30.12)') val
123 write(left_real,
'(F30.13)') val
125 write(left_real,
'(F30.14)') val
127 write(left_real,
'(F30.15)') val
129 write(left_real,
'(F30.16)') val
136 l = len_trim(left_real)
137 if ((l<2) .or. (left_real(l-1:l) ==
".0") .or. &
138 (left_real(l:l) /=
"0"))
exit 141 elseif (val == 0.)
then 144 write(left_real(1:32),
'(ES23.14)') val
146 write(left_real(1:32),
'(ES23.15)') val
149 ind = index(left_real,
"0E")
151 if (left_real(ind-1:ind-1) ==
".")
exit 152 left_real = left_real(1:ind-1)//left_real(ind+1:)
155 left_real = adjustl(left_real)
162 character(len=1320) :: left_reals
163 real,
intent(in) :: r(:)
164 character(len=*),
optional :: sep
166 integer :: j, n, b, ns
168 character(len=10) :: separator
169 n=1 ; dowrite=.true. ; left_reals=
'' ; b=1
170 if (
present(sep))
then 171 separator=sep ; ns=len(sep)
173 separator=
', ' ; ns=2
178 if (r(j)==r(j+1))
then 185 write(left_reals(b:),
'(A)') separator
191 write(left_reals(b:),
'(A)') trim(
left_real(r(j)))
193 n=1 ; b=len_trim(left_reals)+1
201 character(len=*),
intent(in) :: str
202 real,
intent(in) :: val
203 logical :: isFormattedFloatEqualTo
207 isformattedfloatequalto=.false.
208 read(str(1:),*,err=987) scannedval
209 if (scannedval == val) isformattedfloatequalto=.true.
217 character(len=*),
intent(in) :: string
218 integer,
intent(in) :: n
227 character(len=120) function extract_word(string, separators, n)
228 character(len=*),
intent(in) :: string
229 character(len=*),
intent(in) :: separators
230 integer,
intent(in) :: n
232 integer :: ns, i, b, e, nw
233 logical :: lastCharIsSeperator
235 lastcharisseperator = .true.
236 ns = len_trim(string)
237 i = 0; b=0; e=0; nw=0;
240 if (lastcharisseperator)
then 241 if (verify(string(i:i),separators)==0)
then 244 lastcharisseperator = .false.
249 if (verify(string(i:i),separators)==0)
then 250 lastcharisseperator = .true.
260 if (b<=ns .and. nw==n-1)
extract_word = trim(string(b:ns))
265 character(len=*),
intent(in) :: string
266 character(len=*),
intent(in) :: separators
267 integer,
intent(in) :: n
268 integer,
optional,
intent(in) :: missing_value
270 integer :: ns, i, b, e, nw
271 character(len=20) :: word
275 if (len_trim(word)>0)
then 278 if (
present(missing_value))
then 288 real function extract_real(string, separators, n, missing_value)
289 character(len=*),
intent(in) :: string
290 character(len=*),
intent(in) :: separators
291 integer,
intent(in) :: n
292 real,
optional,
intent(in) :: missing_value
294 integer :: ns, i, b, e, nw
295 character(len=20) :: word
299 if (len_trim(word)>0)
then 302 if (
present(missing_value))
then 313 character(len=*),
intent(in) :: string
316 logical :: lastCharIsSeperator
317 lastcharisseperator = .true.
318 ns = len_trim(string)
322 if (string(i:i) /=
' ')
then 336 logical,
intent(in) :: verbose
338 integer :: i(5) = (/ -1, 1, 3, 3, 0 /)
339 real :: r(8) = (/ 0., 1., -2., 1.3, 3.e-11, 3.e-11, 3.e-11, -5.1e12 /)
343 write(*,*)
'==== MOM_string_functions: string_functions_unit_tests ===' 373 if (.not. fail)
write(*,*)
'Pass' 378 logical function localtests(verbose,str1,str2)
379 logical,
intent(in) :: verbose
380 character(len=*),
intent(in) :: str1
381 character(len=*),
intent(in) :: str2
385 write(*,*)
'>'//trim(str1)//
'<' 386 if (
localtests)
write(*,*) trim(str1),
':',trim(str2),
'<-- FAIL' 392 logical,
intent(in) :: verbose
393 integer,
intent(in) :: i1
394 integer,
intent(in) :: i2
399 if (
localtesti)
write(*,*) i1,
'!=',i2,
'<-- FAIL' 405 logical,
intent(in) :: verbose
406 real,
intent(in) :: r1
407 real,
intent(in) :: r2
412 if (
localtestr)
write(*,*) r1,
'!=',r2,
'<-- FAIL' 419 character(len=*),
intent(in) :: dir
421 character(len=len(dir)+2) :: slasher
423 if (len_trim(dir) == 0)
then 425 elseif (dir(len_trim(dir):len_trim(dir)) ==
'/')
then 428 slasher = trim(dir)//
"/" integer function, public extract_integer(string, separators, n, missing_value)
Returns the integer corresponding to the nth word in the argument.
character(len=120) function, public extract_word(string, separators, n)
Returns the string corresponding to the nth word in the argument or "" if the string is not long enou...
logical function localtests(verbose, str1, str2)
True if str1 does not match str2. False otherwise.
logical function localtestr(verbose, r1, r2)
True if r1 is not equal to r2. False otherwise.
character(len=19) function, public left_int(i)
character(len=32) function, public left_real(val)
logical function isformattedfloatequalto(str, val)
logical function localtesti(verbose, i1, i2)
True if i1 is not equal to i2. False otherwise.
character(len=len(input_string)) function, public lowercase(input_string)
character(len=len(dir)+2) function, public slasher(dir)
Returns a directory name that is terminated with a "/" or "./" if the argument is an empty string...
character(len=len(input_string)) function, public uppercase(input_string)
logical function, public string_functions_unit_tests(verbose)
Returns true if a unit test of string_functions fails.
character(len=120) function, public extractword(string, n)
Returns the string corresponding to the nth word in the argument or "" if the string is not long enou...
character(len=1320) function, public left_ints(i)
character(len=120) function, public remove_spaces(string)
Returns string with all spaces removed.
character(len=1320) function, public left_reals(r, sep)
real function, public extract_real(string, separators, n, missing_value)
Returns the real corresponding to the nth word in the argument.