; $Id: dm_to_number.pro,v 1.6 2005/02/07 20:03:59 qiuym Exp $
;#######################################################################
;
; NAME:
;  dm_to_number
;
; PURPOSE:
;  convert string to numbers,default is to convert to a float
;  if the string is empty, return NaN for float or double type
;  return 0 for int,long or byte type
;
; CATEGORY:
;  general
;
; AUTHOR:
;  Yiming Qiu
;  NIST Center for Neutron Research
;  100 Bureau Drive, Gaithersburg, MD 20899-8562
;  United States
;  yiming.qiu@nist.gov
;  Feb, 2005
;
; LICENSE:
;  The software in this file is written by an employee of
;  National Institute of Standards and Technology
;  as part of the DAVE software project.
;
;  The DAVE software package is not subject to copyright protection
;  and is in the public domain. It should be considered as an
;  experimental neutron scattering data reduction, visualization, and
;  analysis system. As such, the authors assume no responsibility
;  whatsoever for its use, and make no guarantees, expressed or
;  implied, about its quality, reliability, or any other
;  characteristic. The use of certain trade names or commercial
;  products does not imply any endorsement of a particular product,
;  nor does it imply that the named product is necessarily the best
;  product for the stated purpose. We would appreciate acknowledgment
;  if the DAVE software is used or if the code in this file is
;  included in another product.
;
;#######################################################################

function dm_to_number,numstr,float=float,int=int,double=double,byte=byte,long=long,count=count
    count = n_elements(numstr)
    tmp  = size(numstr,/type)
    if  keyword_set(byte)       then str = numstr $
    else str=dm_to_string(numstr)
    if  keyword_set(int)        then val = intarr(count) $
    else if keyword_set(long)   then val = lonarr(count) $
    else if keyword_set(double) then val = dblarr(count) $
    else if keyword_set(byte)   then val = bytarr(count) $
    else val = fltarr(count)
    on_ioerror,error
    for i=0,count-1 do begin
       flag  =    1
       tmp   = str[i]+' '  ;default, +' ' to force error with emptry string ''
       if keyword_set(int) then val[i]=fix(str[i],type=2) $
       else if keyword_set(long) then val[i]=fix(str[i],type=3) $
       else if keyword_set(byte) then begin
         if i eq 0 then   val = fix(str[i],type=1) $
         else val = [val,fix(str[i],type=1)]
       endif else if keyword_set(double) then val[i]=double(tmp) $
       else val[i]= float(tmp)
       flag  =    0  ;clear error flag
       error: if flag then begin
         if  keyword_set(int)        then val[i] = 0s $
         else if keyword_set(long)   then val[i] = 0l $
         else if keyword_set(double) then val[i] = !values.d_nan $
         else val[i]=!values.f_nan
       endif
    endfor
    return,(count eq 1)?val[0]:val
end