[85] | 1 | ;+ |
---|
| 2 | ; NAME: |
---|
| 3 | ; DBLTOSTR |
---|
| 4 | ; |
---|
| 5 | ; PURPOSE: |
---|
| 6 | ; |
---|
| 7 | ; This is a program for converting a double precision numerical value |
---|
| 8 | ; to a string. It was originally offered by BioPhys on the IDL newsgroup. |
---|
| 9 | ; |
---|
| 10 | ; AUTHOR: |
---|
| 11 | ; |
---|
| 12 | ; FANNING SOFTWARE CONSULTING |
---|
| 13 | ; David Fanning, Ph.D. |
---|
| 14 | ; 1645 Sheely Drive |
---|
| 15 | ; Fort Collins, CO 80526 USA |
---|
| 16 | ; Phone: 970-221-0438 |
---|
| 17 | ; E-mail: davidf@dfanning.com |
---|
| 18 | ; Coyote's Guide to IDL Programming: http://www.dfanning.com |
---|
| 19 | ; |
---|
| 20 | ; CATEGORY: |
---|
| 21 | ; |
---|
| 22 | ; Utility |
---|
| 23 | ; |
---|
| 24 | ; CALLING SEQUENCE: |
---|
| 25 | ; |
---|
| 26 | ; stringValue = DblToStr(value) |
---|
| 27 | ; |
---|
| 28 | ; INPUTS: |
---|
| 29 | ; |
---|
| 30 | ; value - A double-precision or floating point value to be converted to a string. |
---|
| 31 | ; |
---|
| 32 | ; OUTPUTS: |
---|
| 33 | ; |
---|
| 34 | ; stringValue - The converted string value. |
---|
| 35 | ; |
---|
| 36 | ; KEYWORDS: |
---|
| 37 | ; |
---|
| 38 | ; None. |
---|
| 39 | ; |
---|
| 40 | ; RESTRICTIONS: |
---|
| 41 | ; |
---|
| 42 | ; Assumes 14 significant digits of precision. |
---|
| 43 | ; |
---|
| 44 | ; MODIFICATION HISTORY: |
---|
| 45 | ; |
---|
| 46 | ; Written by BioPhys and offered to the IDL newsgroup, 7 November 2005. |
---|
| 47 | ; Slightly modified and renamed by David Fanning, 30 November, 2005. |
---|
| 48 | ;- |
---|
| 49 | ; |
---|
| 50 | ;########################################################################### |
---|
| 51 | ; |
---|
| 52 | ; LICENSE |
---|
| 53 | ; |
---|
| 54 | ; This software is OSI Certified Open Source Software. |
---|
| 55 | ; OSI Certified is a certification mark of the Open Source Initiative. |
---|
| 56 | ; |
---|
| 57 | ; Copyright © 2005 Fanning Software Consulting. |
---|
| 58 | ; |
---|
| 59 | ; This software is provided "as-is", without any express or |
---|
| 60 | ; implied warranty. In no event will the authors be held liable |
---|
| 61 | ; for any damages arising from the use of this software. |
---|
| 62 | ; |
---|
| 63 | ; Permission is granted to anyone to use this software for any |
---|
| 64 | ; purpose, including commercial applications, and to alter it and |
---|
| 65 | ; redistribute it freely, subject to the following restrictions: |
---|
| 66 | ; |
---|
| 67 | ; 1. The origin of this software must not be misrepresented; you must |
---|
| 68 | ; not claim you wrote the original software. If you use this software |
---|
| 69 | ; in a product, an acknowledgment in the product documentation |
---|
| 70 | ; would be appreciated, but is not required. |
---|
| 71 | ; |
---|
| 72 | ; 2. Altered source versions must be plainly marked as such, and must |
---|
| 73 | ; not be misrepresented as being the original software. |
---|
| 74 | ; |
---|
| 75 | ; 3. This notice may not be removed or altered from any source distribution. |
---|
| 76 | ; |
---|
| 77 | ; For more information on Open Source Software, visit the Open Source |
---|
| 78 | ; web site: http://www.opensource.org. |
---|
| 79 | ; |
---|
| 80 | ;########################################################################### |
---|
| 81 | |
---|
| 82 | |
---|
| 83 | FUNCTION DBLTOSTR, value |
---|
| 84 | |
---|
| 85 | ; Error handling. |
---|
| 86 | On_Error, 2 |
---|
| 87 | IF N_Elements(value) EQ 0 THEN Message, 'Double precision or floaing value must be passed to the function.' |
---|
| 88 | |
---|
| 89 | ; Get the data type. |
---|
| 90 | theType = Size(value, /Type) |
---|
| 91 | IF theType NE 4 AND theType NE 5 THEN BEGIN |
---|
| 92 | value = Double(value) |
---|
| 93 | theType = 5 |
---|
| 94 | ENDIF |
---|
| 95 | |
---|
| 96 | ; Data extension. |
---|
| 97 | typeExt = theType EQ 4?'E':'D' |
---|
| 98 | |
---|
| 99 | ; Create a string, using the full-widtet G format. |
---|
| 100 | rawstr = StrTrim(String(value, Format = '(g)'), 2) |
---|
| 101 | |
---|
| 102 | ; Extract the sign from the string and remove it for the moment. |
---|
| 103 | sign = StrMid(rawstr, 0, 1) EQ '-'?'-':'' |
---|
| 104 | rawstr = sign EQ ''?rawstr:StrMid(rawstr, 1) |
---|
| 105 | |
---|
| 106 | ; Is there an exponent in the string? If so, remove that for the moment. |
---|
| 107 | epos = StrPos(rawstr, 'e') |
---|
| 108 | indx = epos gt -1?StrMid(rawstr, epos+1):'' |
---|
| 109 | rawstr = indx EQ ''?rawstr:StrMid(rawstr, 0, epos) |
---|
| 110 | |
---|
| 111 | ; Find the position of the decimal point. |
---|
| 112 | dpos = StrPos(rawstr, '.') |
---|
| 113 | |
---|
| 114 | ; Rounding process (assumes 14 significant digits). |
---|
| 115 | outstr = StrArr(15) |
---|
| 116 | FOR i = 0, 14 DO outstr[i] = StrMid(rawstr, i, 1) |
---|
| 117 | aux = Fix(StrMid(rawstr, 16, 1)) GE 5?1:0 |
---|
| 118 | FOR i = 14, 0, -1 DO BEGIN |
---|
| 119 | IF i NE dpos then BEGIN |
---|
| 120 | sumstr = StrTrim(String(aux+fix(outstr[i])), 2) |
---|
| 121 | sumlen = StrLen(sumstr) |
---|
| 122 | outstr[i] = StrMid(sumstr, sumlen-1, 1) |
---|
| 123 | aux = sumlen EQ 1?0:1 |
---|
| 124 | ENDIF |
---|
| 125 | ENDFOR |
---|
| 126 | |
---|
| 127 | ; Throw away '0's at the end. |
---|
| 128 | ii = 14 |
---|
| 129 | WHILE outstr[ii] EQ '0' DO BEGIN |
---|
| 130 | ii = ii-1 |
---|
| 131 | ENDWHILE |
---|
| 132 | |
---|
| 133 | ; Reconstruct the string. |
---|
| 134 | saux = aux NE 0?'1':'' |
---|
| 135 | outstr = sign + saux + StrJoin(outstr[0:ii]) + typeExt + indx |
---|
| 136 | |
---|
| 137 | ; Return it. |
---|
| 138 | RETURN, outstr |
---|
| 139 | |
---|
| 140 | END |
---|
| 141 | |
---|