Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Delphi - Is there a better way to get state abbreviations from state names


const
states : array [0..49,0..1] of string =
(
('Alabama','AL'),
('Montana','MT'),
('Alaska','AK'),
('Nebraska','NE'),
('Arizona','AZ'),
('Nevada','NV'),
('Arkansas','AR'),
('New Hampshire','NH'),
('California','CA'),
('New Jersey','NJ'),
('Colorado','CO'),
('New Mexico','NM'),
('Connecticut','CT'),
('New York','NY'),
('Delaware','DE'),
('North Carolina','NC'),
('Florida','FL'),
('North Dakota','ND'),
('Georgia','GA'),
('Ohio','OH'),
('Hawaii','HI'),
('Oklahoma','OK'),
('Idaho','ID'),
('Oregon','OR'),
('Illinois','IL'),
('Pennsylvania','PA'),
('Indiana','IN'),
('Rhode Island','RI'),
('Iowa','IA'),
('South Carolin','SC'),
('Kansas','KS'),
('South Dakota','SD'),
('Kentucky','KY'),
('Tennessee','TN'),
('Louisiana','LA'),
('Texas','TX'),
('Maine','ME'),
('Utah','UT'),
('Maryland','MD'),
('Vermont','VT'),
('Massachusetts','MA'),
('Virginia','VA'),
('Michigan','MI'),
('Washington','WA'),
('Minnesota','MN'),
('West Virginia','WV'),
('Mississippi','MS'),
('Wisconsin','WI'),
('Missouri','MO'),
('Wyoming','WY')
);
function getabb(state:string):string;
var
  I:integer;
begin
  for I := 0 to length(states) -1 do
  if lowercase(state) = lowercase(states[I,0]) then
  begin
    result:= states[I,1];
  end;
end;
function getstate(state:string):string;
var
  I:integer;
begin
  for I := 0 to length(states) -1 do
  if lowercase(state) = lowercase(states[I,1]) then
  begin
    result:= states[I,0];
  end;
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
 edit1.Text:=getabb(edit1.Text);
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
 edit1.Text:=getstate(edit1.Text);
end;

end.

Is there a bette way to do this?

like image 924
Bill Avatar asked Apr 28 '10 22:04

Bill


People also ask

What states Cannot be abbreviated?

The names of eight states are never abbreviated in datelines or text: Alaska, Hawaii, Idaho, Iowa, Maine, Ohio, Texas and Utah. Memory aid: States with five or fewer letters, plus Alaska and Hawaii, are never abbreviated.


1 Answers

Should this kind of data be hard coded?
Wouldn't it be better to use something like a XML file or even just a CSV.

Or Name Value Pairs, i.e. IA=Iowa
then loaded into a TStringList to get

States.Values['IA'] = 'Iowa';

Then you just need to write something to search the Values to work backwards like

//***Untested***
//Use: NameOfValue(States, 'Iowa') = 'IA'

function NameOfValue(const strings: TStrings; const Value: string): string;
var
  i : integer;
  P: Integer;
  S: string;
begin
  for i := 0 to strings.count - 1 do
  begin
    S := strings.ValueFromIndex[i];
    P := AnsiPos(strings.NameValueSeparator, S);
    if (P <> 0) and (AnsiCompareText(Copy(S, 1, P - 1), Value) = 0) then
     begin
      Result := strings.Names[i];
      Exit;
     end;
  end;
  Result := '';
end;

I'm fairly sure its case insensitive too

like image 95
Christopher Chase Avatar answered Oct 03 '22 00:10

Christopher Chase