|
17 | 17 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
18 | 18 | */ |
19 | 19 |
|
| 20 | +#include <string.h> |
20 | 21 | #include <istream> |
21 | 22 | #include <time.h> |
22 | 23 | #include <sstream> |
|
30 | 31 | #include <wx/numformatter.h> |
31 | 32 |
|
32 | 33 | #include "../GenUtils.h" |
33 | | -#include "../GeoDa.h" |
| 34 | +//#include "../GeoDa.h" |
34 | 35 | #include "../logger.h" |
35 | 36 | #include "../ShapeOperations/OGRDataAdapter.h" |
36 | 37 | #include "../GdaException.h" |
@@ -789,135 +790,91 @@ OGRColumnString::~OGRColumnString() |
789 | 790 | // This column -> vector<double> |
790 | 791 | void OGRColumnString::FillData(vector<double>& data) |
791 | 792 | { |
| 793 | + const char* thousand_sep = CPLGetConfigOption("GEODA_LOCALE_SEPARATOR", ","); |
| 794 | + const char* decimal_sep = CPLGetConfigOption("GEODA_LOCALE_DECIMAL", "."); |
| 795 | + bool use_custom_locale = false; |
| 796 | + if ((strlen(thousand_sep) > 0 && strcmp(thousand_sep, ",") != 0) || |
| 797 | + (strlen(decimal_sep) > 0 && strcmp(decimal_sep, ".") != 0)) { |
| 798 | + // customized locale numeric |
| 799 | + use_custom_locale = true; |
| 800 | + } |
| 801 | + |
792 | 802 | if (is_new) { |
793 | 803 | for (int i=0; i<rows; ++i) { |
794 | 804 | double val = 0.0; |
795 | | - if ( !new_data[i].ToDouble(&val) ) { |
796 | | - undef_markers[i] = true; |
| 805 | + if (use_custom_locale) { |
| 806 | + new_data[i].Replace(thousand_sep, ""); |
| 807 | + new_data[i].Replace(decimal_sep, "."); |
797 | 808 | } |
| 809 | + wxNumberFormatter::FromString(new_data[i], &val); |
798 | 810 | data[i] = val; |
799 | 811 | } |
800 | 812 |
|
801 | 813 | } else { |
802 | 814 | int col_idx = GetColIndex(); |
803 | 815 | wxString tmp; |
804 | | - char *old_locale, *saved_locale = 0; |
805 | 816 |
|
806 | 817 | for (int i=0; i<rows; ++i) { |
807 | 818 | if ( undef_markers[i] == true) { |
808 | 819 | data[i] = 0.0; |
809 | 820 | continue; |
810 | 821 | } |
811 | 822 | tmp = wxString(ogr_layer->data[i]->GetFieldAsString(col_idx)); |
812 | | - double val; |
813 | | - if (tmp.IsEmpty()) { |
814 | | - data[i] = 0.0; |
815 | | - undef_markers[i] = true; |
816 | | - } else if (tmp.ToDouble(&val)) { |
817 | | - data[i] = val; |
818 | | - } else { |
819 | | - // try to use different locale |
820 | | - if (i==0) { |
821 | | - // get name of current locale |
822 | | - old_locale = setlocale(LC_NUMERIC, NULL); |
823 | | - // Copy the name so it won’t be clobbered by setlocale |
824 | | - saved_locale = strdup (old_locale); |
825 | | - // try comma as decimal point |
826 | | - setlocale(LC_NUMERIC, "de_DE"); |
827 | | - } |
828 | | - double _val; |
829 | | - if (tmp.ToDouble(&_val)) { |
830 | | - data[i] = _val; |
831 | | - } else { |
832 | | - data[i] = 0.0; |
833 | | - undef_markers[i] = true; |
834 | | - } |
| 823 | + |
| 824 | + if (use_custom_locale) { |
| 825 | + tmp.Replace(thousand_sep, ""); |
| 826 | + tmp.Replace(decimal_sep, "."); |
835 | 827 | } |
836 | | - } |
837 | | - if (saved_locale) { |
838 | | - // restore locale |
839 | | - setlocale(LC_NUMERIC, saved_locale); |
840 | | - free(saved_locale); |
| 828 | + |
| 829 | + double val = 0.0; |
| 830 | + wxNumberFormatter::FromString(tmp, &val); |
| 831 | + data[i] = val; |
841 | 832 | } |
842 | 833 | } |
843 | 834 | } |
844 | 835 |
|
845 | 836 | // This column -> vector<wxInt64> |
846 | 837 | void OGRColumnString::FillData(vector<wxInt64> &data) |
847 | 838 | { |
| 839 | + const char* thousand_sep = CPLGetConfigOption("GEODA_LOCALE_SEPARATOR", ","); |
| 840 | + const char* decimal_sep = CPLGetConfigOption("GEODA_LOCALE_DECIMAL", "."); |
| 841 | + bool use_custom_locale = false; |
| 842 | + if ((strlen(thousand_sep) > 0 && strcmp(thousand_sep, ",") != 0) || |
| 843 | + (strlen(decimal_sep) > 0 && strcmp(decimal_sep, ".") != 0)) { |
| 844 | + // customized locale numeric |
| 845 | + use_custom_locale = true; |
| 846 | + } |
| 847 | + |
848 | 848 | if (is_new) { |
849 | 849 | for (int i=0; i<rows; ++i) { |
850 | 850 | wxInt64 val = 0; |
851 | | - if (!new_data[i].ToLongLong(&val)) { |
852 | | - //wxString error_msg = wxString::Format("Fill data error: can't convert '%s' to integer number.", new_data[i]); |
853 | | - //throw GdaException(error_msg.mb_str()); |
854 | | - double d_val; |
855 | | - if (new_data[i].ToDouble(&d_val)) { |
856 | | - val = static_cast<wxInt64>(d_val); |
857 | | - data[i] = val; |
858 | | - } else { |
859 | | - undef_markers[i] = true; |
860 | | - data[i] = 0; |
861 | | - } |
862 | | - } else { |
863 | | - data[i] = val; |
| 851 | + if (use_custom_locale) { |
| 852 | + new_data[i].Replace(thousand_sep, ""); |
| 853 | + new_data[i].Replace(decimal_sep, "."); |
864 | 854 | } |
| 855 | + wxNumberFormatter::FromString(new_data[i], &val); |
| 856 | + data[i] = val; |
865 | 857 | } |
866 | 858 | } else { |
867 | 859 | int col_idx = GetColIndex(); |
868 | 860 | bool conv_success = true; |
869 | 861 | wxString tmp; |
870 | | - char *old_locale, *saved_locale = 0; |
871 | 862 |
|
872 | 863 | for (int i=0; i<rows; ++i) { |
873 | 864 | if ( undef_markers[i] == true) { |
874 | 865 | data[i] = 0; |
875 | 866 | continue; |
876 | 867 | } |
877 | 868 | tmp = wxString(ogr_layer->data[i]->GetFieldAsString(col_idx)); |
878 | | - wxInt64 val; |
879 | | - double val_d; |
880 | | - |
881 | | - if (tmp.IsEmpty()) { |
882 | | - undef_markers[i] = true; |
883 | | - data[i] = 0; |
884 | | - |
885 | | - } else if (tmp.ToLongLong(&val)) { |
886 | | - data[i] = val; |
887 | | - |
888 | | - } else if (tmp.ToDouble(&val_d)) { |
889 | | - val = static_cast<wxInt64>(val_d); |
890 | | - data[i] = val; |
891 | | - |
892 | | - } else { |
893 | | - // try to use different locale |
894 | | - if (i==0) { |
895 | | - // get name of current locale |
896 | | - old_locale = setlocale(LC_NUMERIC, NULL); |
897 | | - // Copy the name so it won’t be clobbered by setlocale |
898 | | - saved_locale = strdup (old_locale); |
899 | | - // try comma as decimal point |
900 | | - setlocale(LC_NUMERIC, "de_DE"); |
901 | | - } |
902 | | - wxInt64 val_; |
903 | | - double val_d_; |
904 | | - if (tmp.ToLongLong(&val_)) { |
905 | | - data[i] = val_; |
906 | | - |
907 | | - } else if (tmp.ToDouble(&val_d_)) { |
908 | | - val_ = static_cast<wxInt64>(val_d_); |
909 | | - data[i] = val_; |
910 | | - |
911 | | - } else { |
912 | | - data[i] = 0; |
913 | | - undef_markers[i] = true; |
914 | | - } |
| 869 | + wxInt64 val = 0; |
| 870 | + |
| 871 | + if (use_custom_locale) { |
| 872 | + tmp.Replace(thousand_sep, ""); |
| 873 | + tmp.Replace(decimal_sep, "."); |
915 | 874 | } |
916 | | - } |
917 | | - if (saved_locale) { |
918 | | - // restore locale |
919 | | - setlocale(LC_NUMERIC, saved_locale); |
920 | | - free(saved_locale); |
| 875 | + |
| 876 | + wxNumberFormatter::FromString(tmp, &val); |
| 877 | + data[i] = val; |
921 | 878 | } |
922 | 879 | } |
923 | 880 | } |
|
0 commit comments