indian_formatters 0.0.2 copy "indian_formatters: ^0.0.2" to clipboard
indian_formatters: ^0.0.2 copied to clipboard

A comprehensive Flutter/Dart package for India-specific number formatting, currency, validators (PAN, Aadhaar, GST, IFSC, UPI), date utilities, and address tools. All-in-one — one import, everything included.

example/lib/main.dart

import 'package:flutter/material.dart';
import 'package:indian_formatters/indian_formatters.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Indian Formatters Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        useMaterial3: true,
      ),
      home: const DemoHomePage(),
    );
  }
}

class DemoHomePage extends StatefulWidget {
  const DemoHomePage({super.key});

  @override
  State<DemoHomePage> createState() => _DemoHomePageState();
}

class _DemoHomePageState extends State<DemoHomePage>
    with SingleTickerProviderStateMixin {
  late TabController _tabController;

  @override
  void initState() {
    super.initState();
    _tabController = TabController(length: 3, vsync: this);
  }

  @override
  void dispose() {
    _tabController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Indian Formatters Demo'),
        bottom: TabBar(
          controller: _tabController,
          tabs: const [
            Tab(text: 'Numbers & Currency'),
            Tab(text: 'Validators'),
            Tab(text: 'Date & Address'),
          ],
        ),
      ),
      body: TabBarView(
        controller: _tabController,
        children: const [
          NumberCurrencyTab(),
          ValidatorsTab(),
          DateAddressTab(),
        ],
      ),
    );
  }
}

class NumberCurrencyTab extends StatelessWidget {
  const NumberCurrencyTab({super.key});

  @override
  Widget build(BuildContext context) {
    return ListView(
      padding: const EdgeInsets.all(16),
      children: [
        _buildSection('Number Formatting', [
          _buildDemo('Indian Format', '1234567', 1234567.toIndian()),
          _buildDemo('Words', '1234567', 1234567.toIndianWords()),
          _buildDemo('Hindi Words', '100', 100.toWordsHindi()),
          _buildDemo('Compact', '1200000', 1200000.toIndianCompact()),
          _buildDemo('Compact Full', '1200000', 1200000.toIndianCompactFull()),
        ]),
        const Divider(height: 32),
        _buildSection('Currency Formatting', [
          _buildDemo('Rupees', '1234567.89', 1234567.89.toRupees()),
          _buildDemo('Words', '1234567.89', 1234567.89.toRupeesWords()),
          _buildDemo('Compact', '1200000', 1200000.toRupeesCompact()),
          _buildDemo(
              'Cheque Format', '1234567.89', 1234567.89.toChequeFormat()),
        ]),
      ],
    );
  }

  Widget _buildSection(String title, List<Widget> children) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Text(
          title,
          style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
        ),
        const SizedBox(height: 12),
        ...children,
      ],
    );
  }

  Widget _buildDemo(String label, String input, String output) {
    return Padding(
      padding: const EdgeInsets.only(bottom: 12),
      child: Card(
        child: Padding(
          padding: const EdgeInsets.all(12),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text(
                label,
                style: const TextStyle(fontWeight: FontWeight.bold),
              ),
              const SizedBox(height: 4),
              Text('Input: $input'),
              const SizedBox(height: 4),
              Text(
                'Output: $output',
                style: const TextStyle(color: Colors.blue),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

class ValidatorsTab extends StatefulWidget {
  const ValidatorsTab({super.key});

  @override
  State<ValidatorsTab> createState() => _ValidatorsTabState();
}

class _ValidatorsTabState extends State<ValidatorsTab> {
  final _panController = TextEditingController(text: 'ABCPE1234F');
  final _aadhaarController = TextEditingController(text: '234567890123');
  final _gstController = TextEditingController(text: '27AAPFU0939F1ZV');
  final _mobileController = TextEditingController(text: '9876543210');
  final _ifscController = TextEditingController(text: 'SBIN0001234');
  final _pincodeController = TextEditingController(text: '411001');
  final _upiController = TextEditingController(text: 'someone@upi');

  @override
  void dispose() {
    _panController.dispose();
    _aadhaarController.dispose();
    _gstController.dispose();
    _mobileController.dispose();
    _ifscController.dispose();
    _pincodeController.dispose();
    _upiController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return ListView(
      padding: const EdgeInsets.all(16),
      children: [
        _buildValidatorField(
          'PAN Card',
          _panController,
          IndianValidators.validatePAN,
          extraInfo: () {
            final type = IndianValidators.getPANType(_panController.text);
            return 'Type: ${type.name}';
          },
        ),
        _buildValidatorField(
          'Aadhaar',
          _aadhaarController,
          IndianValidators.validateAadhaar,
          extraInfo: () {
            return 'Masked: ${IndianValidators.maskAadhaar(_aadhaarController.text)}';
          },
        ),
        _buildValidatorField(
          'GST Number',
          _gstController,
          IndianValidators.validateGST,
          extraInfo: () {
            final state = IndianValidators.getGSTState(_gstController.text);
            return 'State: ${state ?? 'Unknown'}';
          },
        ),
        _buildValidatorField(
          'Mobile Number',
          _mobileController,
          IndianValidators.validateMobile,
          extraInfo: () {
            return 'Formatted: ${IndianValidators.formatMobile(_mobileController.text)}';
          },
        ),
        _buildValidatorField(
          'IFSC Code',
          _ifscController,
          IndianValidators.validateIFSC,
          extraInfo: () {
            final bank = IndianValidators.getBankFromIFSC(_ifscController.text);
            return 'Bank: ${bank ?? 'Unknown'}';
          },
        ),
        _buildValidatorField(
          'PIN Code',
          _pincodeController,
          IndianValidators.validatePincode,
          extraInfo: () {
            final state =
                IndianValidators.getStateFromPincode(_pincodeController.text);
            return 'Region: ${state ?? 'Unknown'}';
          },
        ),
        _buildValidatorField(
          'UPI ID',
          _upiController,
          IndianValidators.validateUPI,
          extraInfo: () {
            final provider =
                IndianValidators.getUPIProvider(_upiController.text);
            return 'Provider: ${provider ?? 'Unknown'}';
          },
        ),
      ],
    );
  }

  Widget _buildValidatorField(
    String label,
    TextEditingController controller,
    String? Function(String?) validator, {
    String Function()? extraInfo,
  }) {
    return Padding(
      padding: const EdgeInsets.only(bottom: 16),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          TextFormField(
            controller: controller,
            decoration: InputDecoration(
              labelText: label,
              border: const OutlineInputBorder(),
            ),
            validator: validator,
            autovalidateMode: AutovalidateMode.always,
          ),
          if (extraInfo != null && validator(controller.text) == null)
            Padding(
              padding: const EdgeInsets.only(top: 8),
              child: Text(
                extraInfo(),
                style: const TextStyle(color: Colors.blue, fontSize: 12),
              ),
            ),
        ],
      ),
    );
  }
}

class DateAddressTab extends StatelessWidget {
  const DateAddressTab({super.key});

  @override
  Widget build(BuildContext context) {
    final now = DateTime.now();
    final address = IndianAddressFormatter.format(
      line1: '123 Main Street',
      line2: 'Koregaon Park',
      city: 'Pune',
      state: 'Maharashtra',
      pincode: '411001',
    );

    return ListView(
      padding: const EdgeInsets.all(16),
      children: [
        _buildSection('Date Formatting', [
          _buildDemo('Indian Format', now.toString(), now.toIndianFormat()),
          _buildDemo('Hindi Format', now.toString(), now.toHindiFormat()),
          _buildDemo('Devanagari', now.toString(), now.toDevanagari()),
          _buildDemo('Fiscal Year', now.toString(), now.fiscalYear()),
          _buildDemo(
              'Financial Quarter', now.toString(), now.financialQuarter()),
          _buildDemo('Hindu Month', now.toString(), now.hinduMonthName()),
        ]),
        const Divider(height: 32),
        _buildSection('States & Address', [
          _buildStateDemo('Maharashtra', 'MH'),
          _buildStateDemo('Delhi', 'DL'),
          _buildStateDemo('Karnataka', 'KA'),
          const SizedBox(height: 12),
          Card(
            child: Padding(
              padding: const EdgeInsets.all(12),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  const Text(
                    'Formatted Address',
                    style: TextStyle(fontWeight: FontWeight.bold),
                  ),
                  const SizedBox(height: 8),
                  Text(address.formatted),
                ],
              ),
            ),
          ),
        ]),
      ],
    );
  }

  Widget _buildSection(String title, List<Widget> children) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Text(
          title,
          style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
        ),
        const SizedBox(height: 12),
        ...children,
      ],
    );
  }

  Widget _buildDemo(String label, String input, String output) {
    return Padding(
      padding: const EdgeInsets.only(bottom: 12),
      child: Card(
        child: Padding(
          padding: const EdgeInsets.all(12),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text(
                label,
                style: const TextStyle(fontWeight: FontWeight.bold),
              ),
              const SizedBox(height: 4),
              Text(
                'Output: $output',
                style: const TextStyle(color: Colors.blue),
              ),
            ],
          ),
        ),
      ),
    );
  }

  Widget _buildStateDemo(String stateName, String code) {
    final state = IndianStates.byCode(code);
    if (state == null) return const SizedBox.shrink();

    return Padding(
      padding: const EdgeInsets.only(bottom: 12),
      child: Card(
        child: Padding(
          padding: const EdgeInsets.all(12),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text(
                state.name,
                style: const TextStyle(fontWeight: FontWeight.bold),
              ),
              const SizedBox(height: 4),
              Text('Code: ${state.code} | GST Code: ${state.gstCode}'),
              Text('Capital: ${state.capital}'),
              Text('Hindi: ${state.hindiName}'),
            ],
          ),
        ),
      ),
    );
  }
}
4
likes
150
points
233
downloads

Documentation

API reference

Publisher

unverified uploader

Weekly Downloads

A comprehensive Flutter/Dart package for India-specific number formatting, currency, validators (PAN, Aadhaar, GST, IFSC, UPI), date utilities, and address tools. All-in-one — one import, everything included.

Repository (GitHub)
View/report issues

Topics

#formatting #india #validation #utilities

License

MIT (license)

Dependencies

flutter, meta

More

Packages that depend on indian_formatters