mirror of
https://github.com/QB64Official/qb64.git
synced 2024-09-28 11:17:47 +00:00
109 lines
3.9 KiB
Text
109 lines
3.9 KiB
Text
The [[MID$]] function returns a portion of a [[STRING|string]].
|
|
|
|
|
|
{{PageSyntax}}
|
|
: {{Parameter|portion$}} = [[MID$]]({{Parameter|stringValue$}}, {{Parameter|startPosition%}}[, {{Parameter|bytes%}}])
|
|
|
|
|
|
{{PageParameters}}
|
|
* {{Parameter|stringValue$}} can be any literal or variable non-empty [[STRING]] value. Use [[LEN]] to check the length of a string.
|
|
* {{Parameter|startPosition%}} designates the non-zero position of the first character to be returned by the function.
|
|
* {{Parameter|bytes%}} (optional) tells the function how many characters to return including the first character at {{Parameter|startPosition%}}.
|
|
|
|
|
|
{{PageDescription}}
|
|
* When the {{Parameter|bytes%}} value is not passed, the function returns the remainder of the string from the starting character position.
|
|
* Number of character {{Parameter|bytes%}} should be within the string's [[LEN|length]] from the start position, but will only return the string's remainder when exceeded.
|
|
* If the {{Parameter|bytes%}} value is 0 or the {{Parameter|startPosition%}} is 0 or greater than the [[LEN|length]] of the string, an empty string is returned (no error is triggered).
|
|
* In '''QB64''', [[ASC]] string byte position reads are about '''5 times faster''' than MID$ when parsing strings. See ''Example 2'' below.
|
|
|
|
|
|
{{PageQBasic}}
|
|
* In QBasic the {{Parameter|startPosition%}} could not be zero (0) or an [[ERROR Codes|Illegal function call error]] would occur.
|
|
|
|
|
|
{{PageExamples}}
|
|
''Example 1:'' Getting the hour and minutes from [[TIME$]]
|
|
{{CodeStart}} '' ''
|
|
{{Cl|PRINT}} {{Cl|TIME$}}
|
|
|
|
hour$ = {{Cl|LEFT$}}({{Cl|TIME$}}, 2)
|
|
minutes$ = {{Cl|MID$}}({{Cl|TIME$}}, 4, 2) ' skip hours and the colon (first 3 characters)
|
|
|
|
{{Cl|PRINT}} "hour = "; hour$; ": minutes = "; minutes$ '' ''
|
|
{{CodeEnd}}
|
|
{{OutputStart}}11:23:30
|
|
hour = 11: minutes = 23
|
|
{{OutputEnd}}
|
|
|
|
|
|
''Example 2:'' Comparing MID$, the '''QB64''' byte position version of [[ASC]] and [[_MEMGET]] speeds parsing string characters:
|
|
{{CodeStart}} '' ''
|
|
{{Cl|_TITLE}} "String Speed Test"
|
|
{{Cl|DEFLNG}} A-Z
|
|
|
|
'First let's build a string for testing.
|
|
Limit = 100000 'the size of the string
|
|
LoopCount = 1000 'the number of times we want to deconstruct it
|
|
|
|
{{Cl|FOR...NEXT|FOR}} i = 1 {{Cl|TO}} Limit
|
|
t$ = t$ + {{Cl|CHR$}}({{Cl|RND}} * 255)
|
|
{{Cl|NEXT}}
|
|
|
|
'now for some times
|
|
|
|
t1# = {{Cl|TIMER}}
|
|
{{Cl|FOR...NEXT|FOR}} j = 1 {{Cl|TO}} LoopCount
|
|
{{Cl|FOR...NEXT|FOR}} i = 1 {{Cl|TO}} Limit
|
|
m$ = {{Cl|MID$}}(t$, i, 1)
|
|
{{Cl|NEXT}}
|
|
{{Cl|NEXT}}
|
|
t2# = {{Cl|TIMER}}
|
|
{{Cl|FOR...NEXT|FOR}} j = 1 {{Cl|TO}} LoopCount
|
|
{{Cl|FOR...NEXT|FOR}} i = 1 {{Cl|TO}} Limit
|
|
m = {{Cl|ASC}}(t$, i)
|
|
{{Cl|NEXT}}
|
|
{{Cl|NEXT}}
|
|
|
|
t3# = {{Cl|TIMER}}
|
|
{{Cl|$CHECKING}}:OFF
|
|
{{Cl|DIM}} m {{Cl|AS}} {{Cl|_MEM}}, m1 {{Cl|AS}} {{Cl|STRING}} * 1, m2 {{Cl|AS}} {{Cl|_UNSIGNED}} {{Cl|_BYTE}}
|
|
m = {{Cl|_MEMNEW}}(Limit) 'create new memory space for string
|
|
{{Cl|_MEMPUT}} m, m.OFFSET, t$ 'put string t$ into memory space
|
|
{{Cl|FOR...NEXT|FOR}} j = 1 {{Cl|TO}} LoopCount
|
|
{{Cl|FOR...NEXT|FOR}} i = 1 {{Cl|TO}} Limit
|
|
{{Cl|_MEMGET}} m, m.OFFSET + i - 1, m1
|
|
{{Cl|NEXT}}
|
|
{{Cl|NEXT}}
|
|
t4# = {{Cl|TIMER}}
|
|
{{Cl|FOR...NEXT|FOR}} j = 1 {{Cl|TO}} LoopCount
|
|
{{Cl|FOR...NEXT|FOR}} i = 1 {{Cl|TO}} Limit
|
|
{{Cl|_MEMGET}} m, m.OFFSET + i - 1, m2
|
|
{{Cl|NEXT}}
|
|
{{Cl|NEXT}}
|
|
t5# = {{Cl|TIMER}}
|
|
|
|
'results
|
|
|
|
{{Cl|PRINT USING}} "##.###### seconds for MID$"; t2# - t1#
|
|
{{Cl|PRINT USING}} "##.###### seconds for ASC"; t3# - t2#
|
|
{{Cl|PRINT USING}} "##.###### seconds for _MEMGET String"; t4# - t3#
|
|
{{Cl|PRINT USING}} "##.###### seconds for _MEMGET Byte"; t5# - t4# '' ''
|
|
{{CodeEnd}} {{small|Code by Steve McNeill}}
|
|
{{OutputStart}}6.593750 seconds for MID$
|
|
1.044922 seconds for ASC
|
|
0.494141 seconds for _MEMGET String
|
|
0.494141 seconds for _MEMGET Byte
|
|
{{OutputEnd}}
|
|
: ''Note:'' [[_MEMGET]] can be used with [[$CHECKING]]:OFF to cut the parsing speed even more. [[STRING]] * 1 or [[_BYTE]] are similar speeds.
|
|
|
|
|
|
''See also:''
|
|
* [[MID$ (statement)]], [[ASC]]
|
|
* [[LEFT$]], [[RIGHT$]]
|
|
* [[LTRIM$]], [[RTRIM$]]
|
|
* [[INSTR]], [[LEN]]
|
|
* [[_MEMPUT]], [[_MEMGET]]
|
|
|
|
|
|
{{PageNavigation}}
|