• Skip to primary navigation
  • Skip to main content
  • Skip to primary sidebar

Jaranguda

Belajar Mengajar

  • Home
  • Sponsor/Jasa
  • Tentang

Masalah setlocale di PHP Laravel dan Solusinya

Last Updated on 30 January 2020 By tommy Leave a Comment

Masalah di setlocale ini adalah tampilan koma (comma) dan titik (dot) yang tidak konsisten. Disatu waktu bisa muncul hasilnya dengan koma, dilain waktu muncul dengan titik.

Untuk contoh kasus saya akan buat database dengan tabel

CREATE TABLE `dataharga` (
  `id` INT(11) NOT NULL,
  `harga_beli` FLOAT NOT NULL,
  `harga_jual` FLOAT NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
--
-- Dumping data for table `dataharga`
--
 
INSERT INTO `dataharga` (`id`, `harga_beli`, `harga_jual`) VALUES
(1, 10000, 15000),
(2, 9800.24, 15000),
(3, 9700, 14999.9);

Disini saya menggunakan Laravel, dan solusi ini bisa digunakan untuk PHP murni maupun yang menggunakan framework (Codeigniter, Laravel, Slim Framework,Yii Framework dll).
Contoh skrip sederhana

Route::get('/', function () {
    echo "<pre>";
    $harga = \DB::table('dataharga')->select('harga_beli','harga_jual')->get();
    print_r($harga);
});

tampilan script diatas dibrowser

Illuminate\Support\Collection Object
(
    [items:protected] => Array
        (
            [0] => stdClass Object
                (
                    [harga_beli] => 10000
                    [harga_jual] => 15000
                )
 
            [1] => stdClass Object
                (
                    [harga_beli] => 9800.24
                    [harga_jual] => 15000
                )
 
            [2] => stdClass Object
                (
                    [harga_beli] => 9700
                    [harga_jual] => 14999.9
                )
 
        )
 
)

hasil diatas adalah hasil yang diharapkan. Coba tambahkan setlocale diatas

Route::get('/', function () {
    setlocale(LC_ALL, 'id_ID.UTF8', 'id_ID.UTF-8', 'id_ID.8859-1', 'id_ID', 'en_US.UTF8', 'en_US.UTF-8', 'en_US');
    echo "<pre>";
    $harga = \DB::table('dataharga')->select('harga_beli','harga_jual')->get();
    print_r($harga);
});

hasilnya menjadi

Illuminate\Support\Collection Object
(
    [items:protected] => Array
        (
            [0] => stdClass Object
                (
                    [harga_beli] => 10000
                    [harga_jual] => 15000
                )
 
            [1] => stdClass Object
                (
                    [harga_beli] => 9800,24
                    [harga_jual] => 15000
                )
 
            [2] => stdClass Object
                (
                    [harga_beli] => 9700
                    [harga_jual] => 14999,9
                )
 
        )
 
)

lihat di 9800,24 dan 14999,9. Yang ditampilkan menggunakn koma, padahal data yang dipanggil dari database harusnya menggunakan titik. Hasil diatas baik dengan raw query ataupun eloquent.
contoh set locale

Route::get('/', function () {
    echo "<pre>";
    $harga = \DB::table('dataharga')->select('harga_beli','harga_jual')->get();
    print_r($harga);
    echo "<h3>Set Locale</h3>";
    setlocale(LC_ALL, 'id_ID.UTF8', 'id_ID.UTF-8', 'id_ID.8859-1', 'id_ID', 'en_US.UTF8', 'en_US.UTF-8', 'en_US');
    setlocale(LC_ALL, 'id_ID.UTF8', 'id_ID.UTF-8', 'id_ID.8859-1', 'id_ID', 'en_US.UTF8', 'en_US.UTF-8', 'en_US');
    $harga = \DB::table('dataharga')->select('harga_beli','harga_jual')->get();
    print_r($harga);
    $harga = \DB::table('dataharga')->select('harga_beli','harga_jual')->get();
    print_r($harga);
});

outputnya

Illuminate\Support\Collection Object
(
    [items:protected] => Array
        (
            [0] => stdClass Object
                (
                    [harga_beli] => 10000
                    [harga_jual] => 15000
                )
 
            [1] => stdClass Object
                (
                    [harga_beli] => 9800.24
                    [harga_jual] => 15000
                )
 
            [2] => stdClass Object
                (
                    [harga_beli] => 9700
                    [harga_jual] => 14999.9
                )
        )
)
Set Locale
Illuminate\Support\Collection Object
(
    [items:protected] => Array
        (
            [0] => stdClass Object
                (
                    [harga_beli] => 10000
                    [harga_jual] => 15000
                )
 
            [1] => stdClass Object
                (
                    [harga_beli] => 9800,24
                    [harga_jual] => 15000
                )
 
            [2] => stdClass Object
                (
                    [harga_beli] => 9700
                    [harga_jual] => 14999,9
                )
        )
)
Illuminate\Support\Collection Object
(
    [items:protected] => Array
        (
            [0] => stdClass Object
                (
                    [harga_beli] => 10000
                    [harga_jual] => 15000
                )
 
            [1] => stdClass Object
                (
                    [harga_beli] => 9800,24
                    [harga_jual] => 15000
                )
 
            [2] => stdClass Object
                (
                    [harga_beli] => 9700
                    [harga_jual] => 14999,9
                )
        )
)

Kalo hanya dengan satu kasus diatas, belum terlalu kelihatan efek sampingnya. Contoh anda membuat suatu helper untuk membuat tanggal Indonesia, dan di set di app/Providers/AppServiceProvider.php. Kita menggunakan blade untuk menampilkan data, kurang lebih layout standarnya seperti ini

@extends('layouts.app')
 
@section('title', 'Page Title')
 
@section('sidebar')
    @parent
 
    <p>This is appended to the master sidebar.</p>
@endsection
 
@section('content')
    <p>This is my body content.</p>
@endsection

Bila dd($harga) di atas @section('content') hasilnya dengan titik, tetapi bila dibawahnya akan menggunakan koma. Dengan kata lain setiap pemanggilan data setelah inisiasi setlocale dilakukan akan merubah data yang ditampilkan (contoh koma/titik, format tanggal).

Solusi untuk permasalahan ini adalah dengan mereset setlocale ke settingan semula. Seperti yang dibuat di manual setlocale php

If locale is NULL or the empty string “”, the locale names will be set from the values of environment variables with the same names as the above categories, or from “LANG”.

Ubah script diatas menjadi

Route::get('/', function () {
    echo "<pre>";
    $harga = \DB::table('dataharga')->select('harga_beli','harga_jual')->get();
    print_r($harga);
    echo "<h3>Set Locale</h3>";
    setlocale(LC_ALL, 'id_ID.UTF8', 'id_ID.UTF-8', 'id_ID.8859-1', 'id_ID', 'en_US.UTF8', 'en_US.UTF-8', 'en_US');
    setlocale(LC_ALL, 'id_ID.UTF8', 'id_ID.UTF-8', 'id_ID.8859-1', 'id_ID', 'en_US.UTF8', 'en_US.UTF-8', 'en_US');
    $harga = \DB::table('dataharga')->select('harga_beli','harga_jual')->get();
    print_r($harga);
    setlocale(LC_ALL, '');
    $harga = \DB::table('dataharga')->select('harga_beli','harga_jual')->get();
    print_r($harga);
});

yang ditambahkan adalah setlocale(LC_ALL, '');, hasil eksekusi scriptnya

Illuminate\Support\Collection Object
(
    [items:protected] => Array
        (
            [0] => stdClass Object
                (
                    [harga_beli] => 10000
                    [harga_jual] => 15000
                )
 
            [1] => stdClass Object
                (
                    [harga_beli] => 9800.24
                    [harga_jual] => 15000
                )
 
            [2] => stdClass Object
                (
                    [harga_beli] => 9700
                    [harga_jual] => 14999.9
                )
 
        )
 
)
Set Locale
Illuminate\Support\Collection Object
(
    [items:protected] => Array
        (
            [0] => stdClass Object
                (
                    [harga_beli] => 10000
                    [harga_jual] => 15000
                )
 
            [1] => stdClass Object
                (
                    [harga_beli] => 9800,24
                    [harga_jual] => 15000
                )
 
            [2] => stdClass Object
                (
                    [harga_beli] => 9700
                    [harga_jual] => 14999,9
                )
 
        )
 
)
Illuminate\Support\Collection Object
(
    [items:protected] => Array
        (
            [0] => stdClass Object
                (
                    [harga_beli] => 10000
                    [harga_jual] => 15000
                )
 
            [1] => stdClass Object
                (
                    [harga_beli] => 9800.24
                    [harga_jual] => 15000
                )
 
            [2] => stdClass Object
                (
                    [harga_beli] => 9700
                    [harga_jual] => 14999.9
                )
 
        )
 
)

begitulah efek samping setlocale dan solusinya di php.

Tulisan menarik lainnya

  • Aplikasi CRUD di Laravel 5

    Untuk Laravel 5.5 bisa dilihat di Contoh Script PHP CRUD di Laravel 5.5 Disini kita…

  • Menggunakan Datatables di Laravel 5.1 LTS

    Install package Datatables di Laravel dengan cara composer require yajra/laravel-datatables-oracle:~5.0 Buka file config/app.php dibagian providers…

  • Contoh Global Helper di Laravel 5.2

    Laravel 5.2 punya banyak fungsi yang termasuk global helper, global helper disini maksudnya fungsi yang…

  • Mengatasi Error TokenMismatchException di Laravel

    Error TokenMismatchException di Laravel 5, muncul karena form yang anda gunakan belum memiliki csrf token.…

Filed Under: PHP

Reader Interactions

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Primary Sidebar

Pencarian

Tanya Jawab tentang DevOps SRE CPE, gabung di https://t.me/devopsindonesia

Terbaru

  • Solusi helm Upgrade Failed
  • macOS package is untrusted
  • Cara Mengganti Port Screen Sharing macOS
  • Cara Menonaktifkan Pager di macOS
  • Cara Mengupdate Nama Apple silicon-as-a-Service Scaleway

Komentar

  • Beritalogi on Cara Redirect Domain di Cloudflare
  • Putu on Cara Setting TP-LINK EN020-F5 Sebagai Range Extender
  • Budi on Solusi Simple Queue Mikrotik Tidak Berjalan
  • mazda on Tutorial Lengkap Install Mail Server Postfix Dovecot MariaDB di CentOS 7
  • adi on Menggunakan Mikrotik Sebagai SSH Client

Tulisan Populer

  • Password Router Huawei HG8245H5 Indihome 1.2m views
  • Password Terbaru ZTE F609 Indihome 785k views
  • Password Superadmin Huawei HG8245A 322.8k views
  • Cara Setting Manual Modem GPON ZTE F609 Indihome 273.9k views
  • Cara Setting Wireless ZTE F609 Indihome 258.3k views
  • Mengaktifkan Port LAN di Huawei HG8245 Indihome 170.7k views
  • Akses UseeTV Indihome via Wireless ZTE F609 157.1k views
  • Kemana Menghilangnya Saldo BCA 50 ribu 156.2k views
  • Cara Reset Password ZTE F609 Indihome 147.9k views
  • Cara Setting DHCP Server Modem/Router ZTE F609 114.3k views

Kategori

  • Delphi
  • dll
  • Gambas
  • Internet
  • Java
  • Lazarus
  • Linux
  • PHP
  • Review
  • Teknologi

Sponsor

kadal.id
carakami.com
kuotabisa.com
Untuk jadi sponsor, hubungi kita lewat halaman sponsor
© 2021. Jaranguda
  • Linux
  • PHP
  • Internet
  • Teknologi
  • Delphi
  • Gambas
  • Java