@@ -289,7 +289,7 @@ OGRColumnInteger::OGRColumnInteger(wxString name, int field_length, int decimals
289289 undef_markers.resize (rows);
290290 for (int i=0 ; i<rows; ++i) {
291291 new_data[i] = 0 ;
292- undef_markers[i] = false ;
292+ undef_markers[i] = true ;
293293 }
294294}
295295
@@ -303,7 +303,7 @@ OGRColumnInteger::OGRColumnInteger(OGRLayerProxy* ogr_layer, wxString name,
303303 undef_markers.resize (rows);
304304 for (int i=0 ; i<rows; ++i) {
305305 new_data[i] = 0 ;
306- undef_markers[i] = false ;
306+ undef_markers[i] = true ;
307307 }
308308}
309309
@@ -467,8 +467,8 @@ void OGRColumnInteger::SetValueAt(int row_idx, const wxString &value,
467467 }
468468
469469 wxInt64 l_val;
470- if ( GenUtils::validInt (value) ) {
471- GenUtils::strToInt64 (value, &l_val);
470+
471+ if (value. ToLongLong ( &l_val)) {
472472 if (is_new) {
473473 new_data[row_idx] = l_val;
474474 } else {
@@ -741,7 +741,7 @@ OGRColumnString::OGRColumnString(wxString name, int field_length,
741741 undef_markers.resize (rows);
742742 for (int i=0 ; i<rows; ++i) {
743743 new_data[i] = wxEmptyString;
744- undef_markers[i] = false ;
744+ undef_markers[i] = true ;
745745 }
746746}
747747OGRColumnString::OGRColumnString (OGRLayerProxy* ogr_layer, wxString name,
@@ -754,7 +754,7 @@ OGRColumnString::OGRColumnString(OGRLayerProxy* ogr_layer, wxString name,
754754 undef_markers.resize (rows);
755755 for (int i=0 ; i<rows; ++i) {
756756 new_data[i] = wxEmptyString;
757- undef_markers[i] = false ;
757+ undef_markers[i] = true ;
758758 }
759759}
760760
@@ -787,9 +787,6 @@ void OGRColumnString::FillData(vector<double>& data)
787787 for (int i=0 ; i<rows; ++i) {
788788 double val = 0.0 ;
789789 if ( !new_data[i].ToDouble (&val) ) {
790- // internal is always local "C"
791- // wxString error_msg = wxString::Format( "Fill data error: can't convert '%s' to floating-point number.", new_data[i]);
792- // throw GdaException(error_msg.c_str());
793790 undef_markers[i] = true ;
794791 }
795792 data[i] = val;
@@ -798,35 +795,44 @@ void OGRColumnString::FillData(vector<double>& data)
798795 } else {
799796 int col_idx = GetColIndex ();
800797 wxString tmp;
801-
802- // default C locale
798+ char *old_locale, *saved_locale = 0 ;
799+
803800 for (int i=0 ; i<rows; ++i) {
804801 if ( undef_markers[i] == true ) {
805802 data[i] = 0.0 ;
806803 continue ;
807804 }
808-
809805 tmp = wxString (ogr_layer->data [i]->GetFieldAsString (col_idx));
810-
811806 double val;
812807 if (tmp.IsEmpty ()) {
813808 data[i] = 0.0 ;
814809 undef_markers[i] = true ;
815810 } else if (tmp.ToDouble (&val)) {
816811 data[i] = val;
817812 } else {
818- // try comma as decimal point
819- setlocale (LC_NUMERIC, " de_DE" );
813+ // try to use different locale
814+ if (i==0 ) {
815+ // get name of current locale
816+ old_locale = setlocale (LC_NUMERIC, NULL );
817+ // Copy the name so it won’t be clobbered by setlocale
818+ saved_locale = strdup (old_locale);
819+ // try comma as decimal point
820+ setlocale (LC_NUMERIC, " de_DE" );
821+ }
820822 double _val;
821823 if (tmp.ToDouble (&_val)) {
822824 data[i] = _val;
823825 } else {
824826 data[i] = 0.0 ;
825827 undef_markers[i] = true ;
826828 }
827- setlocale (LC_NUMERIC, " C" );
828829 }
829830 }
831+ if (saved_locale) {
832+ // restore locale
833+ setlocale (LC_NUMERIC, saved_locale);
834+ free (saved_locale);
835+ }
830836 }
831837}
832838
@@ -855,14 +861,13 @@ void OGRColumnString::FillData(vector<wxInt64> &data)
855861 int col_idx = GetColIndex ();
856862 bool conv_success = true ;
857863 wxString tmp;
858-
859- // default C locale
864+ char *old_locale, *saved_locale = 0 ;
865+
860866 for (int i=0 ; i<rows; ++i) {
861867 if ( undef_markers[i] == true ) {
862868 data[i] = 0 ;
863869 continue ;
864870 }
865-
866871 tmp = wxString (ogr_layer->data [i]->GetFieldAsString (col_idx));
867872 wxInt64 val;
868873 double val_d;
@@ -879,7 +884,15 @@ void OGRColumnString::FillData(vector<wxInt64> &data)
879884 data[i] = val;
880885
881886 } else {
882- setlocale (LC_NUMERIC, " de_DE" );
887+ // try to use different locale
888+ if (i==0 ) {
889+ // get name of current locale
890+ old_locale = setlocale (LC_NUMERIC, NULL );
891+ // Copy the name so it won’t be clobbered by setlocale
892+ saved_locale = strdup (old_locale);
893+ // try comma as decimal point
894+ setlocale (LC_NUMERIC, " de_DE" );
895+ }
883896 wxInt64 val_;
884897 double val_d_;
885898 if (tmp.ToLongLong (&val_)) {
@@ -893,9 +906,13 @@ void OGRColumnString::FillData(vector<wxInt64> &data)
893906 data[i] = 0 ;
894907 undef_markers[i] = true ;
895908 }
896- setlocale (LC_NUMERIC, " C" );
897909 }
898910 }
911+ if (saved_locale) {
912+ // restore locale
913+ setlocale (LC_NUMERIC, saved_locale);
914+ free (saved_locale);
915+ }
899916 }
900917}
901918
@@ -1074,7 +1091,10 @@ void OGRColumnString::SetValueAt(int row_idx, const wxString &value,
10741091 new_data[row_idx] = value;
10751092 } else {
10761093 int col_idx = GetColIndex ();
1077- ogr_layer->data [row_idx]->SetField (col_idx, value.mb_str (*m_wx_encoding));
1094+ if (m_wx_encoding)
1095+ ogr_layer->data [row_idx]->SetField (col_idx, value.mb_str (*m_wx_encoding));
1096+ else
1097+ ogr_layer->data [row_idx]->SetField (col_idx, value.mb_str ());
10781098 }
10791099 undef_markers[row_idx] = false ;
10801100}
0 commit comments