MID$ - QB64 Wiki


From QB64 Wiki

Revision as of 16:22, 20 August 2014 by Clippy (Talk | contribs)
(diff) ← Older revision | Current revision (diff) | Newer revision → (diff)
Jump to: navigation, search

The MID$ function returns a portion of a STRING's value from any position inside a string.


MID$(stringvalue$, startposition%[, bytes%])


  • stringvalue can be any literal or variable STRING value having a length. See LEN.
  • startposition designates the non-zero position of the first character to be returned by the function.
  • bytes (optional) tells the function how many characters to return including the first character when it is used.


  • When the bytes value is not used the function returns the remainder of the string from the starting character position.
  • Number of character bytes should be within the string's length from the start position, but will only return the string's remainder when exceeded.
  • If the bytes value is 0 or the start position is 0 or greater than the length of the string, nothing is returned (no error).
  • In QBasic the start position cannot be zero(0) or an Illegal function call error will occur.
  • In QB64 ASC string byte position reads are about 5 times faster than MID$ when parsing strings. See Example 2 below.

Example 1: Getting the hour and minutes from TIME$

PRINT TIME$ hour$ = LEFT$(TIME$, 2) minutes$ = MID$(TIME$, 4, 2) ' skip hours and the colon (first 3 characters) PRINT "hour = "; hour$; ": minutes = "; minutes$

11:23:30 hour = 11: minutes = 23

Example 2: Comparing MID$, the QB64 byte position version of ASC and _MEMGET speeds parsing string characters:

_TITLE "String Speed Test" 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 FOR i = 1 TO Limit t$ = t$ + CHR$(RND * 255) NEXT 'now for some times t1# = TIMER FOR j = 1 TO LoopCount FOR i = 1 TO Limit m$ = MID$(t$, i, 1) NEXT NEXT t2# = TIMER FOR j = 1 TO LoopCount FOR i = 1 TO Limit m = ASC(t$, i) NEXT NEXT t3# = TIMER $CHECKING:OFF DIM m AS _MEM, m1 AS STRING * 1, m2 AS _UNSIGNED _BYTE m = _MEMNEW(Limit) 'create new memory space for string _MEMPUT m, m.OFFSET, t$ 'put string t$ into memory space FOR j = 1 TO LoopCount FOR i = 1 TO Limit _MEMGET m, m.OFFSET + i - 1, m1 NEXT NEXT t4# = TIMER FOR j = 1 TO LoopCount FOR i = 1 TO Limit _MEMGET m, m.OFFSET + i - 1, m2 NEXT NEXT t5# = TIMER 'results PRINT USING "##.###### seconds for MID$"; t2# - t1# PRINT USING "##.###### seconds for ASC"; t3# - t2# PRINT USING "##.###### seconds for _MEMGET String"; t4# - t3# PRINT USING "##.###### seconds for _MEMGET Byte"; t5# - t4#

Code by Steve McNeill

6.593750 seconds for MID$ 1.044922 seconds for ASC 0.494141 seconds for _MEMGET String 0.494141 seconds for _MEMGET Byte

Note: _MEMGET can be used with $CHECKING:OFF to cut the parsing speed even more! STRING * 1 or _BYTE are similar speeds.

See also:

Go to Keyword Reference - Alphabetical
Go to Keyword Reference - By usage
Go to Main WIKI Page
Personal tools